-1
4

2 回答 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 回答