簡體   English   中英

使用正則表達式無法匹配字符串

[英]Cannot match string using regex

我正在研究一些正則表達式,我想知道為什么這個正則表達式

"(?<=(.*?id(( *)=)\\s[\"\']))g"

與字符串不匹配

<input id = "g" />

在Java?

Java.util.regex不支持無限后視,如RegexBuddy所述

壞消息是,大多數正則表達式都不允許您在lookbehind中使用任何正則表達式,因為它們無法向后應用正則表達式。 因此,正則表達式引擎需要能夠在檢查lookbehind之前找出退回的步驟數。

從文檔中添加一些說明:

因此,許多正則表達式,包括Perl和Python使用的那些,只允許固定長度的字符串。 您可以使用任何可以預先確定匹配長度的正則表達式。 這意味着您可以使用文字文本和字符類。 您不能使用重復或可選項。 您可以使用交替,但僅當交替中的所有選項具有相同的長度時。

一些正則表達式的風格,如PCRE和Java支持上述,加上不同長度的字符串的交替。 交替的每個部分仍必須具有有限的最大長度。 這意味着您仍然不能使用星號或加號,但您可以使用問號和帶有指定max參數的花括號。 這些正則表達式的味道認識到有限重復可以被重寫為具有不同但固定長度的字符串的交替。 不幸的是,當你在lookbehind中使用交替時,JDK 1.4和1.5有一些錯誤。 這些是在JDK 1.6中修復的。

所以有幾個人已經解釋了為什么你的正則表達式不起作用(而且它確實是致命的; Java正則表達式不能滿足你的需要)。 但是,你可能想知道你現在應該如何解析這個......

看起來你要解析的字符串是XML。 Regex實際上不是解析XML的好方法; XML中可編碼的內容與使用正則表達式匹配的內容之間存在不匹配。 因此,如果這是某些XML文本的一部分,可以考慮將其篡改為XML解析器,然后您可以查詢不同的元素。

有關此問題的冷靜和合理的討論,請參閱此經典stackoverflow帖子: RegEx匹配除XHTML自包含標記之外的開放標記

希望這可以幫助!

Java不僅不允許無限制的lookbehind,如果你嘗試,它應該拋出異常。 您沒有看到該異常的事實本身就是一個錯誤

無論如何你不應該使用lookbehind。 如果要匹配某個屬性的值,最簡單,最麻煩的方法是匹配整個屬性並使用捕獲組來提取值。 例如:

String source = "<input id = \"g\" />"; 
Pattern p = Pattern.compile("\\bid\\s*=\\s*\"([^\"]*)\"");
Matcher m = p.matcher(source);
if (m.find())
{
  System.out.printf("Found 'id' attribute '%s' at position %d%n",
                    m.group(1), m.start());
}

輸出:

Found 'id' attribute 'g' at position 7

幫自己一個忙,暫時忘掉看后衛。 即使他們沒有馬車,它們也很棘手,而且它們真的沒有你想象的那么有用。

java.util.regex不支持lookbehind中的無限重復

暫無
暫無

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

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