2016-11-14 69 views
3

我想創建一個正則表達式以便將字符串拆分爲字典中的單詞。如果字符串匹配,我可以迭代每個組並進行一些更改。一些詞是別人的前綴。然而,像/(HH|HH12)+/這樣的正則表達式不匹配字符串HH12HHlink。正則表達式有什麼問題?是否應該匹配字符串中的第一個HH12然後HH正則表達式將字符串拆分爲字典中的單詞

+0

什麼'/(HH(?:12)?)+ /' –

+0

@EliSadoff我必須保留'HH'和'HH12',因爲迭代組時我需要知道它是'HH'或'HH12'。此外,這只是一個例子。想象你只有一本字典,'HH'和'HH12'在詞典中。字典中的單詞也在變化。 – qqibrow

+0

切換變化,它首先匹配'HH',然後沒有什麼更匹配。或者在模式的末尾添加'$'。 –

回答

1

要匹配Java中的整個字符串應該只包含HH12HH子。在兩個步驟中做起來要容易得多:1)檢查字符串是否符合要求(這裏是matches("(?:HH12|HH)+")); 2)提取所有的令牌(這裏是HH12|HHHH(?:12)?,因爲在未錨定的交替組中的第一個選擇「勝出「其餘的都沒有考慮)。

String str = "HH12HH"; 
Pattern p = Pattern.compile("HH12|HH"); 
List<String> res = new ArrayList<>(); 
if (str.matches("(?:HH12|HH)+")) { // If the whole string consists of the defined values 
    Matcher m = p.matcher(str); 
    while (m.find()) { 
     res.add(m.group()); 
    } 
} 
System.out.println(res); // => [HH12, HH] 

Java demo

另一種方法是一個正則表達式,將檢查字符串是否符合開頭用超前的要求,然後將匹配的連續令牌與\G操作:

String str = "HH12HH"; 
Pattern p = Pattern.compile("(\\G(?!^)|^(?=(?:HH12|HH)+$))(?:HH12|HH)"); 
List<String> res = new ArrayList<>(); 
Matcher m = p.matcher(str); 
while (m.find()) { 
    res.add(m.group()); 
} 
System.out.println(res); 

another Java demo

詳細

  • (\\G(?!^)|^(?=(?:HH12|HH)+$)) - 後跟隨着HH12HH(?:HH12|HH)+)1+序列到字符串的末尾之前的成功匹配(\\G(?!^))或字符串(^)的(|)開始的端部($
  • (?:HH12|HH) - 要麼HH12要麼HH
+0

太棒了!你覺得這個http://stackoverflow.com/a/16817458/1646996?它也使用'\\ G',但看起來不像這個複雜。 – qqibrow

+0

這取決於你需要什麼,你還沒有精簡。我在我的回答中解釋道:如果您需要確保字符串* only *由滿足您的模式的令牌組成,則必須首先限定字符串以進行標記化。這就是爲什麼我提出了一個更復雜的模式,將'\ G'分成'^(?= ...)'和'\ G(?!^)'。 '\ G(?:HH12 | HH)'只會匹配字符串開頭的多個標記,並且如果字符串中有其他文本,那麼匹配仍然會被收集。 –

1

在串HH12HH,正則表達式(HH|HH12)+會以這種方式工作:

HH12HH 
^ - both option work, continue 
HH12HH 
^ - First condition is entierly satisfied, mark it as match 
HH12HH 
^- No Match 
HH12HH 
^- No Match 

當你設置好的了A標誌,錨添加到字符串的開頭,其餘的將不會提高匹配。如果刪除它,該模式將在末尾與起始&處的HH匹配。

在這種情況下,你有三種選擇:

  • 把longuest模式第一/(HH12|HH)/AgSee demo我更喜歡的那個。
  • 相互共享部分並使用可選組/(HH(?:12)?)/AgSee second demo
  • 將一個$末像這樣/(HH|HH12)$/Ag
+0

那麼如何匹配整個字符串? – qqibrow

+0

謝謝!但只有一場小組賽。如果我想要所有的團體怎麼辦?例如,第一組應該匹配'HH12'第二組'HH' – qqibrow

+0

@ qqibrow哪種語言?另請參閱[重複捕獲組與重複組捕獲](http://www.regular-expressions.info/captureall.html) –

0

您遇到的問題完全與正則表達式引擎決定匹配的方式有關。

正如我解釋here,有一些正則表達式風格,挑選最長的交替......但你沒有使用一個。 Java的正則表達式引擎是另一種類型:使用第一個匹配的交替。

你的正則表達式的作品很多這樣的代碼:

if(bool1){ 
    // This is where `HH` matches 
} else if (bool1 && bool2){ 
    // This is where `HH12` would match, but this code will never execute 
} 

來解決,這是爲了你的話在倒車時,使HH12HH之前發生的最好方法。

然後,你可以搭配的改變:

HH12|HH 

這應該是很明顯的匹配什麼,因爲你可以得到每場比賽的結果。

(你也可以把它自己的拍攝組中的每個字,但是這是一個有點困難的工作。)

相關問題