2016-04-21 74 views
1

我正在嘗試編寫一個java程序,它將查找字符串中的特定單詞。我有它的大部分工作,但它似乎不匹配,如果匹配的單詞是字符串中的第一個或最後一個單詞。這裏有一個例子:正則表達式不匹配字符串的第一個字和最後一個字

"trying to find the first word".matches(".*[^a-z]find[^a-z].*") //returns true 
"trying to find the first word".matches(".*[^a-z]trying[^a-z].*") //returns false 
"trying to find the first word".matches(".*[^a-z]word[^a-z].*") //returns false 

任何想法如何讓這場比賽在字符串中的任何單詞?

由於提前,

克雷格

+1

'\ bWORD \ b'作爲'\ b'是「文字邊界」錨點。相關閱讀:http://www.regular-expressions.info/wordboundaries.html – CollinD

+0

爲什麼你不只是使用'String.contains(String)'? – showp1984

+0

即時通訊不使用包含,因爲我不想找到其他人的話(即如果我尋找燒傷,燒傷將是真的) 我試圖把\ b,但它似乎並沒有工作。 – craigtb

回答

0

的問題是你的性格課前和詞[^a-z]後 - 我認爲你真正想要的是一個單詞邊界字符\b(按ColinD的評論)作爲反對不在az範圍內的角色。正如評論中所指出的(謝謝),您還需要處理字符串個案的開始和結束。

因此,嘗試,如:

"(?:^|.*\b)trying(?:\b.*|$)" 
+1

'\ W'不能匹配'^'和'$'嗎?還是我誤會了? – CollinD

+1

@CollinD對該問題的評論是正確的。這個答案是行不通的,因爲字符類「[]」完全匹配一個字符。起初,沒有前面的字符。 – sapanoia

+1

'\ B'實際上是非字邊界錨。 '\ b'是用於單詞邊界的。 – CollinD

0

您可以使用可選的,檢查下面的鏈接和測試更多的情況下,如果此給予適當的輸出(?): https://regex101.com/r/oP5zB8/1

(.*[^a-z]?trying[^a-z]?.*) 
+3

這裏,'。* [^ a-z]?'是一樣好'。*'。 – sapanoia

0

我覺得(^|^.*[^a-z])trying([^a-z].*$|$)恰好符合你的需求。

(?:^|^.*[^a-z])trying(?:[^a-z].*$|$)用於不捕獲括號。

0

你可以試試下面的程序來檢查任何字符串的開始和結束的存在:

package com.ajsodhi.utilities; 

import java.util.regex.Pattern; 

public class RegExStartEndWordCheck { 

    public static final String stringToMatch = "StartingsomeWordsEndWord"; 

    public static void main(String[] args) { 

     String regEx = "Starting[A-Za-z0-9]{0,}EndWord"; 
     Pattern patternOriginalSign = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE); 
     boolean OriginalStringMatchesPattern = patternOriginalSign.matcher(stringToMatch).matches(); 
     System.out.println(OriginalStringMatchesPattern); 
    } 
} 
0

你應該使用的指定開頭或一個詞來代替[^ AZ的結局邊界\ b ]這不是那麼邏輯。 就像

".*\\bfind\\b.*" 
相關問題