问问题
217 次
2 回答
1
于 2013-09-21T15:15:41.757 回答
0
据我了解,您想匹配任何以 ?! 结尾的句子。和省略号“...”,同时忽略“”中的文本。您也不想在任何单个数字或大写字母上结束匹配,然后是 ?!。或者 ...
在这种情况下,这将起作用:
([^„]*?(„[^“]+?“)*)+?(?<!\b[\dA-Z])([?!]|[.]{1,3})
代码示例:
public static void Main()
{
string pattern = @"([^„]*?(„[^“]+?“)*)+?(?<!\b[\dA-Z])([?!]|[.]{1,3})";
string input = "Šios sutarties sąlygos taikomos „Microsoft. Hotmail“, „Microsoft. SkyDrive“, „Microsoft“ abonementui.";
var matches = Regex.Matches( input, pattern );
foreach( Match match in matches )
{
Console.WriteLine(match.Value.Trim());
}
}
输出:
Šios sutarties sąlygos taikomos „微软。Hotmail”、“微软。SkyDrive”、“Microsoft” abonementui。
对于输入:1.The „Acme. Photo“ is good. Test string „Microsoft. Hotmail“... Some more text? Even more text! Final text.
输出:
1.“极致。照片“很好。
测试字符串“微软。热邮件“...
还有一些文字?
更多文字!
最终文本。
正则表达式的解释:([^„]*?(„[^“]+?“)*)+?(?<!\b[\dA-Z])([?!]|[.]{1,3})
[^„]*?
匹配任何不是“„”的内容。*? 表示惰性匹配(非贪婪)。([„][^“]+?[“])*
用 0 个或多个 „“</li> 实例跟随此匹配项+?
意味着懒惰地匹配这个 1 次或多次(即之前的所有内容!,?,.,...)(?<!\b[\dA-Z])
表示对单个数字或大写字母进行否定的查找。基本上,不匹配?!。或 ... 如果前面有数字或大写字母。([?!]|[.]{1,3})
表示匹配跟随上一个匹配?或者 !或 1 到 3 。(点/句号)
通常我会使用 (?>) 来提高性能,但我认为我们会保持正则表达式简单。这个网站很有帮助。
希望有帮助。
于 2013-09-22T12:11:27.037 回答