2013-09-21 48 views
-1

我需要将文本解析为句子,但我遇到了一些问题。我用正则表达式这种百通:如何使用RegEx分割文本?

@"(?<=[\.!\?\...])\s+" 

...从文本拆分句子。但是,当我有文字,如:

Šios sutarties sąlygos taikomos „Microsoft. Hotmail“, „Microsoft. SkyDrive“, „Microsoft“ abonementui. 

我需要正则表达式来拆分所有句子,但它分裂成两句话代替:

  1. Šios sutarties sąlygos taikomos „Microsoft.
  2. Hotmail“, „Microsoft. SkyDrive“, „Microsoft“ abonementui.

我怎么能写正则表情女巫忽略符号[. ! ? ...]这些符号

+0

您的示例文本的预期输出是什么? –

+1

这可能有帮助。 http://stackoverflow.com/questions/5695240/php-regex-to-ignore-escaped-quotes-within-quotes – cgTag

+0

我期望得到一个sentense ho从[Šiossutarties ..]开始,直到[... rosoft“abonementui 。],但不是两个发送:/ –

回答

1

这就是它。

这里是RE的一些细节:

  • (.*?„.*?“)*?比赛0〜的some words outside „some words inside“无限基;
  • [^„]*?(((?<!(\\d|\\b[A-Z]))\\.)|[!?])在它们之前逃离了点.?!和无独立;
  • ((?<!(\\d|\\b[A-Z]))\\.)上一个项目的子字符串,使得点号.特殊,它不应该以单个大写字母或数字作为前缀;
  • 保重所有*? s,确保我们没有超过匹配。

    using System; 
    using System.Text.RegularExpressions; 
    
    
    namespace RegexTest 
    { 
        class MainClass 
        { 
         public static void Main(string[] args) 
         { 
          string[] cases = 
          { 
           "Šios sutarties sąlygos taikomos „Microsoft. Hotmail“, „Microsoft. SkyDrive“, „Microsoft“ abonementui.", 
           "Šios sutarties sąlygos taikomos „Microsoft“. Hotmail, „Microsoft. SkyDrive“, „Microsoft“ abonementui! Ok? more", 
           "1. Hello world. And MORE.", 
           "V. Hello world. And MORE.", 
           "1. V. Hello world. And MORE.", 
           "I am in room 102. And you?", 
          }; 
    
          var re = new Regex("(.*?„.*?“)*?[^„]*?(((?<!\\b(\\d|[A-Z]))\\.)|[!?])"); 
    
          foreach (var case_ in cases) { 
           foreach (Match m in re.Matches(case_)) 
            Console.WriteLine(m); 
    
           Console.WriteLine("------------I am a splitter :) ------------"); 
          } 
         } 
        } 
    } 
    

输出:

Šios sutarties sąlygos taikomos „Microsoft. Hotmail“, „Microsoft. SkyDrive“, „Microsoft“ abonementui. 
    ------------I am a splitter :) ------------ 
    Šios sutarties sąlygos taikomos „Microsoft“. 
    Hotmail, „Microsoft. SkyDrive“, „Microsoft“ abonementui! 
    Ok? 
    ------------I am a splitter :) ------------ 
    1. Hello world. 
    And MORE. 
    ------------I am a splitter :) ------------ 
    V. Hello world. 
    And MORE. 
    ------------I am a splitter :) ------------ 
    1. V. Hello world. 
    And MORE. 
    ------------I am a splitter :) ------------ 
    I am in room 102. 
    And you? 
    ------------I am a splitter :) ------------ 
+0

不错的作品!!!!! :)但是如何写他直到[。]但是直到[。!? ...]? –

+0

它的不错的正则表达式和它的作品,但是这个句子怎么做: 1. V. Adamkus visada daug padedavo saliai。 ??? Regex retyrns: 1. V. Adamkus visada daug padedavo saliai。 但我需要所有的句子。如果在[。|?|!]是数字或大写字母的长度等于1之前,正则表达式不会终止。 :/ –

+0

@EimantasŽlabys谢谢,我可能不太了解你的评论。你能否在你的问题之后添加新的案例并格式化?我稍后会更新我的答案。 – Logan

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()); 
    } 
} 

输出继电器:

SIOS sutartiessąlygostaikomos“微软。 Hotmail“,”微软。 SkyDrive“,”微软“abonementui。

对于输入:1.The „Acme. Photo“ is good. Test string „Microsoft. Hotmail“... Some more text? Even more text! Final text.

输出继电器:

1.“Acme公司。照片“很好。

测试字符串“Microsoft。 Hotmail“...

还有一些文字?

更多文字!

最终文本。

说明正则表达式:([^„]*?(„[^“]+?“)*)+?(?<!\b[\dA-Z])([?!]|[.]{1,3})

  • [^„]*?匹配任何不是“”。 *?意味着懒惰的匹配(非贪婪)。
  • ([„][^“]+?[“])*遵循本场比赛以“”
  • +?手段这1次或多次匹配懒洋洋的0个或多个实例(即之前的一切!,?,。,...)
  • (?<!\b[\dA-Z])手段做一个负回顾后为单个数字或大写字母。基本上不匹配?!或...如果在数字或资本之前。
  • ([?!]|[.]{1,3})是指与前次比赛?要么 !或1至3。 (点/句号)

通常我会用(?>)来表现,但我认为我们会保持正则表达式的简单。 This site是非常有帮助的。

希望有所帮助。