我想提取字串中除波浪號(~)match-this以外的任何內容所包含的子句的匹配項。
例如,在這個字串中:
match-this~match-this~ match-this ~match-this#match-this~match-this~match-this
上面應該有 5 個匹配項。比賽解釋如下(用[]括起來):
- 要么 要么
match-this~對match-this第一場比賽是正確的。 match-this對第二場比賽是正確的。- 第 3 場比賽要么 要么
~match-this#正確~match-this。 - 對于第 4 場比賽,要么
#match-this~或#match-this要么match-this~是正確的。 - 對于第 5 場比賽,要么正確,
~match-this要么match-this正確。
我可以使用模式~match-this~catch these ~match-this~,但是當我嘗試否定它時(?!(~match-this)),它實際上會捕獲所有空值。
當我嘗試 pattern[^~]match-this[^~]時,它只捕獲一個匹配項(上面的第二個匹配項)。當我嘗試在波浪號的任何否定上添加星號通配符時,要么 要么[^~]match-this[^~]*,[^~]*match-this[^~]我只有 2 場比賽。當我將星號通配符放在兩者上時,它會捕獲所有match-this內容,包括由波浪線括起來的內容~。是否可以僅通過一個正則運算式測驗來實作這一目標?還是需要更多??
uj5u.com熱心網友回復:
如果您還想#match-this~作為單獨的匹配進行匹配,則必須在匹配時考慮 # ,以及[^~]匹配#
您可以匹配您不想要的內容,并在一個組中捕獲您想要保留的內容。
~[^~#]*~|((?:(?!match-this).)*match-this(?:(?!match-this)[^#~])*)
解釋
~[^~#]*~匹配除~或#之間的任何字符~|要么(捕獲組 1(?:(?!match-this).)*如果不直接跟在 *match-this 后面,則匹配任何字符~match-this從字面上匹配(?:(?!match-this)[^#~])*匹配任何字符,除非~或#如果不直接后跟匹配此
)關閉組 1
請參閱正則運算式演示和Python 演示。
例子
import re
pattern = r"~[^~#]*~|((?:(?!match-this).)*match-this(?:(?!match-this)[^#~])*)"
s = "match-this~match-this~ match-this ~match-this#match-this~match-this~match-this"
res = [m for m in re.findall(pattern, s) if m]
print (res)
輸出
['match-this', ' match-this ', '~match-this', '#match-this', 'match-this']
uj5u.com熱心網友回復:
為此,您需要兩種環視。這將匹配您想要的 5 個位置,并且它只能以這種方式而不是另一種方式作業以及為什么不能包含前綴和/或后綴是有原因的:
(?<=~)match-this(?!~)|(?<!~)match-this(?=~)|(?<!~)match-this(?!~)
解釋環視:
(?=...)是一個積極的前瞻:接下來發生的事情必須匹配(?!...)是負前瞻:接下來的內容不能匹配(?<=...)是一個積極的看法:前面的必須匹配(?<!...)后面是負面的看法:前面的不能匹配
為什么其他方法不起作用:
[^~]是一個帶有否定的類,但它總是需要一個字符存在并且還為匹配本身消耗該字符。前者是起始文本的問題。后者是進步太遠的問題,因此“不匹配”字符已經消失。(^|[^~])將解決第一個問題:文本開始或它必須是與此不匹配的字符。我們可以對結束文本做同樣的事情,但無論如何這又是一次死了。- 只剩下外觀,即使那樣我們也必須對所有 3 個變體進行編碼,因此兩個
|. - 根據環視的性質,無法捕捉前面或后面的角色。此外,如果您還想匹配前導字符或尾隨字符,則這與識別下一個潛在匹配項相沖突。
告訴引擎“不匹配”一個字符和告訴引擎在不實際消耗字符的情況下“注意”某些東西并推進文本中的當前位置之間是有區別的。也不是每個正則運算式引擎都支持所有的lookarounds,所以你真正想在哪里使用它很重要。對我來說,它在TextPad 8中運行良好,并且在PCRE中也應該運行良好( PHP中的fe )。根據regex101.com/r/CjcaWQ/1,它也可以按我的預期作業。
讓我惱火的是:如果找到的匹配的前導和/或尾隨字符對您很重要,那么在處理所有匹配時只需從輸入中提取它,因為它們還帶有起始位置和長度:首先匹配0字符10的位置表示您查看輸入文本位置-1和10.
uj5u.com熱心網友回復:
如果所有五個匹配項都可以(與第三"match-this"個匹配項的要求相矛盾)您可以匹配正則運算式
~match-this~|(\bmatch-this\b)
并僅保留捕獲的匹配項(以捕獲組 1)。這個想法是丟棄未捕獲的匹配并保留已捕獲的匹配。當正則運算式引擎匹配"~match-this~"時,它的內部字串指標將移動到剛剛結束的位置"~",從而跳過不需要的子字串。
演示
正則運算式可以分解如下。
~match-this~ # match literal
| # or
( # begin capture group 1
\b # match a word boundary
match-this # match literal
\b # match a word boundary
) # end capture group 1
如此簡單,大多數正則運算式引擎都支持這個正則運算式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457107.html
標籤:正则表达式
下一篇:拆分Javascript字串
