2016-11-13 234 views
1

我想匹配並查找由空格或特殊字符包圍的單詞的索引。例如:正則表達式匹配包含非字母數字字符的單詞

To find: test 
this is input test : True 
this is#input_ : True 
this isinput : False 
thisisinputtest: False 
this @test is right: True. 

我該如何匹配並找到索引。我現在正則表達式失敗:(?i)[^a-zA-Z0-9]test[^a-zA-Z0-9]

+0

這是一個不同的情況下,因爲在我的情況,#test_應該返回測試指標並不#TEST 。 – Maxsteel

+0

「_」是一個單詞,不是特殊字符。此外,'這是#input_'不能是'True',那裏有'test'這個詞在那裏?測試用例中缺少'#test_'。 –

+0

*非字母數字。此外,在一場比賽中,我想要「測試」的索引。所有其他的例子給出了完整的匹配! – Maxsteel

回答

2

我想你需要什麼你的情況使用lookarounds:

(?<!\p{Alnum})test(?!\p{Alnum}) 

負回顧後(?<!\p{Alnum})將失敗的比賽,如果有存在的test左邊的字母數字字符,並且如果在test之後存在字母數字字符,則否定前瞻(?!\p{Alnum})將會使匹配失敗。

見測試截圖:

enter image description here

Java demo

String str = "this is#test_ :"; 
Pattern ptrn = Pattern.compile("(?<!\\p{Alnum})test(?!\\p{Alnum})"); 
Matcher matcher = ptrn.matcher(str); 
while (matcher.find()) { 
    System.out.println(matcher.start()); 
} 

替代辦法:比賽和捕捉到的搜索詞,並打印1日開始位置捕獲組:

Pattern ptrn = Pattern.compile("\\P{Alnum}(test)\\P{Alnum}"); 
... 
System.out.println(matcher.start(1)); 

看到這個Java demo

注意,在這種情況下,\P{Alnum}消費模式,並在一些邊緣情況,test可能不會得到匹配。

+0

雖然我不清楚這個問題(對不起!),這正是我想要的!非常感謝! – Maxsteel

+0

對於那些只需要字母字符而非字母數字的人,可以使用'「(?<!\\ p {Alpha})test(?!\\ p {Alpha})」' –

+1

@DatNguyen:注意'\ p {Alpha}默認情況下僅使用ASCII字母(如果您未指定'Pattern.UNICODE_CHARACTER_CLASS'標誌)。要匹配任何Unicode字母而不依賴於標誌,請使用'「(?<!\\ p {L})test(?!\\ p {L})」'。 –

0

我只是想了解你的問題。您正在尋找被特殊角色(包含)或空間包圍的test? 但你說this is#input_ : True。我不確定我是否挑選了這個錯誤,但在那種情況下如何是真的?

無論如何,我已經得到了正則表達式[\W\s_](input|test)[\W\s_]匹配所有您定義爲true的情況。

  • \ W匹配任何非單詞
  • \ s任何空白
  • _匹配任何下劃線匹配 - 必須建立在自己的定義,因爲這是一個字
  • 從我所提到的試驗的困惑我有正則表達式搜索輸入和測試

此外我用戶this網站隨時與我正確的工作,因爲我覺得它非常有用。

不知道這是你想要的答案,但讓我知道,如果我錯了,我會再試一次

相關問題