[英]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.