var s = "ООО \"Парус\" и ООО \"НПП \"Рога и копыта\"";
var s2 = Regex.Replace(s, "\"(\\w+)", "«$1");
var s3 = Regex.Replace(s2, "(\\w+)\"", "$1»");
Console.WriteLine(s3);
string res = Regex.Replace("ООО \"Парус\" и ОАО \"Рога и копыта\"",
"\"(\\w[\\w ]*\\w)\"", @"«$1»");
MessageBox.Show(res, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information);
var input = "ООО \"Парус\"и ОАО \"НПП \"Рога и копыта\"\"";
var openQuote = "«";
var closeQuote = "»";
var quotationMark = "\"";
// Шаг 1. Замена кавычек в которые заключено целое слово.
input = Regex.Replace(input, "\"(\\w+)\"", openQuote + "$1" + closeQuote );
// Шаг 2. Замена кавычек в которые заключено несколько слов
// (разделенных пробелом, запятой, точкой, или любым другим символом).
if (input.Contains(simpleQuote))
input = Regex.Replace(input, "\"(.+)\"", openQuote + "$1" + closeQuote );
// Шаг 3. Замена оставшихся кавычек. Есть есть символ буквы справа от кавычки ",
// то замена на «; если слева, то на ».
if (input.Contains(simpleQuote))
{
input = Regex.Replace(input, "\"(\\w+)", openQuote + "$1");
input = Regex.Replace(input, "(\\w+)\"", "$1" + closeQuote );
}
// Результат: ООО «Парус»и ОАО «НПП «Рога и копыта»»
对于解决方案,您可以使用Regex.Replace
要获取要替换的字符串的所需部分,可以使用以下正则表达式
在这种情况下,引号之间的文本将存储在第一组中。
通过简单地替换引号,您可以使用带有字符串的重载:
如果你需要一些额外的操作,你可以使用接受 MatchEvaluator 的重载:
从理论上讲,您需要将单词前的引号替换为开头的引号,将单词后的引号替换为结尾的引号。像这样(也许代码可以简化):
这是另一种选择:
这是一种更严格的搜索方法,尝试几个选项:
"\"(\\w[\\w ]*\\w)\""- 公司名称可以包含字母和数字(字符类“\w”),并由多个单词组成(构造"[\\w ]*")"\"(\\a[\\a ]*\\a)\""- 此模板与上一个模板类似,但与第一个模板不同的是,它不允许"\\a"公司名称中包含数字 ( )。"\"(\\p{IsCyrillic}[\\p{IsCyrillic} ]*\\p{IsCyrillic})\""- 公司名称只能使用西里尔字母 ("\\p{IsCyrillic}")。你也可以尝试使用这个字符类,
"\\p{Lu}"它定义了很多大写字母。但是,有时会出现需要非平凡方法的情况,例如,在类似情况下:
“开箱即用”的正则表达式实际上不适用,对于这种情况没有明确的解决方案。有时什么都可以查到,比如可以用量词{n,m}限制公司名称子串的大小,意思是前一个元素至少要重复n次,但不能超过m 次。并添加更精确的符号指示所需片段的开头,在本例中,这是指示 jur 类型的最后一组单词。人(“LLC”、“OJSC”、“CJSC”等)。
名称中的嵌套引号可以用简单的模式来区分
"\s«\w"。这是此类代码的示例:来源:https ://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx#character_classes
解决类似问题的另一种方法。