簡體   English   中英

正則表達式:String.split和Pattern.matches彼此不一致

[英]Regex: String.split and Pattern.matches does not agree with each other

我正在練習我的正則表達式查找方法,為此,我試圖從SQL插入語句中提取表名。 我有正則表達式(?<=INSERT INTO )\\w+(?= (\\(|VALUES).+)並且正在String INSERT INTO tests VALUES (regex, test) 。我的regex並非精心制作,我希望它與我輸入的tests子字符串匹配。

我正在使用Java的正則表達式引擎,並打印出當我在正則表達式上使用String.split和在正則表達式上進行Pattern.matches時發生的結果。 我得到以下看似矛盾的結果

regex> (?<=INSERT INTO )\w+(?= (\(|VALUES).+)
string> INSERT INTO tests VALUES (regex, test)
[INSERT INTO ,  VALUES (regex, test)]
regex> (?<=INSERT INTO )\w+(?= (\(|VALUES).+)
string> INSERT INTO tests VALUES (regex, test)
false

現在,為了記錄在案,產生第一個結果的代碼是

Arrays.toString(searchString.split(regex))

而第二個來自

Pattern.matches(regex, searchString)

split不是將匹配項上的字符串拆分為其參數嗎? 這意味着正則表達式匹配tests因此結果為[INSERT INTO , VALUES (regex, test)] 那么,為什么Pattern.matches返回false? 我錯過了什么嗎?

如果您使用以下方法,如果出現相同問題,我會嘗試:

Pattern p = Pattern.compile(yourRegex);
Matcher m = p.matcher(inputString); 

並檢查m.find()返回true

Pattern.matches期望整個字符串都匹配-環顧四周可能會出現問題,因為它們是零寬度的斷言,因此匹配的字符將被丟棄。

只是為了補充一下喬安娜的答案:前行和后備不參加比賽。 Pattern.matches要求正則表達式匹配從字符串的開頭一直到結尾。 由於您具有向后看的正面( INSERT INTO ),因此匹配從text開頭而不是開頭開始。 同樣,末尾的先行意味着末尾也沒有匹配項。

split可以按預期工作,因為它不需要比賽從頭開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM