2013-09-21 81 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是非常有幫助的。

希望有所幫助。