我正在尋找字串中帶有特殊單詞的某些條目。字串看起來像這樣。
entry 1: hello
entry 2: world
entry 3: this
is a multiline
that makes it hard
entry 4: here we have a special entry
entry 5: here
we
have
another special entry
in a multiline
entry 6: end
因為它是一個多行問題,所以我使用 Java 的 DOTALL 以便.匹配也換行符。
我正在尋找包含special一詞的條目。
首先,我試圖找到一個捕獲完整條目的正則運算式:entry \d : .*?(?=\s*(entry \d: )|\Z). 這就像一個簡化版本,這
然后我想,好吧,我只需要交換.*?我需要找到的正則運算式。但entry \d : .*?special.*?(?=\s*(entry \d: )|\Z)不起作用,可能是因為特殊打破了表達的貪婪。
有誰知道更好的解決方案?
uj5u.com熱心網友回復:
您可以使用溫和的貪婪令牌:
(?s)entry \d : (?:(?!entry \d : ).)*special.*?(?=\s*entry \d : |$)
請參閱正則運算式演示。詳情:
entry \d :-entry空格 一位或多位數字,:, 空格(?:(?!entry \d : ).)*- 任何字符,重復零次或多次,不以entry空格 一位或多位數字:開頭,, 空格序列special- 一個固定的字串.*?- 盡可能少的零個或多個字符(?=\s*entry \d : |$)- 匹配字串中緊跟零個或多個空格、entry、空格、一個或多個數字:和空格或字串結尾的位置的正向前瞻。
注意:不要Pattern.MULTILINE與此正則運算式一起使用。或者,繼續使用\Z(字串的結尾,或位于尾隨換行符之前的位置,LF 字符)。
uj5u.com熱心網友回復:
如果您使用單詞和空格類而不是點,那么它似乎有效
/entry \d : [\w\s]*special[\w\s]*?(?=\s*(?:entry \d :)|$)/gm
似乎如果你:在文本中允許冒號,它會破壞運算式。
而且\Z你的表達中也有,但在我看來,行尾$更適合這里
uj5u.com熱心網友回復:
[編輯:] 不幸的是,我錯過了條目的多行性質,因此此答案對單行條目有效,但僅回傳多行條目的第一行。不過,我認為可以通過為分隔符設定某個正則運算式來克服這一點。
我建議您使用 aScanner來處理多行方面。這會給你一個令牌流(行)。然后您可以使用 aString.contains(...)或 aString.matches(...)來過濾令牌。
var result = new Scanner(myMultiLineString).tokens()
.useDelimiter("\\n")
// alternatively use String.contains(...)
// if you're looking for a constant
// rather than a complex rule.
.filter(s -> s.matches(regex))
.collect(Collectors.toList());
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/377504.html
上一篇:將T-SQL陳述句轉換為JavaScriptRegExp時有哪些問題
下一篇:洗掉級別<30的所有行
