[英]Regex match with lookbehind and lookahead with named groups
我正在嘗試匹配以下文字:
"abc" matches "b" and field[cba] = "cba" or (field[cba] matches "c") and "cc" = "bb"
“匹配”之前和之后的部分到命名組中。
我需要將“abc”與${left}
和“b”匹配為${right}
,然后在第二場比賽中匹配“field [cba]”/“c”。
我需要給${left}
和${right}
邊界,以便它們在以下情況下中斷:
剩下:
" and "
, " or "
, "("
不在雙引號(“)時 對:
" and "
, " or "
, ")"
當不在雙引號(“)時 我想使用的替換正則表達式模式是:
RegExpMatch(${left}, ${right})
所以要獲得以下輸出:
RegExpMatch("abc","b") and field[cba] = "cba" or (RegExpMatch(field[cba],"c")) and "cc" = "bb"
我嘗試過:
(?<=^|\\(| or | and )(?<left>.*?) matches (?<right>.*?)(?=\\)|$| and | or )
這有幾個問題:
^
作為字符串的開頭似乎使lookbehind貪婪並且它從字符串的開始捕獲,即使之前有" or "
或" and "
,這很奇怪,因為$
似乎工作正常 " or "
, " and "
, "("
或")"
僅在不在引號中時匹配(在文字中) 你能幫我找出正確的常規模式嗎?
問題是它看到and
在你的前瞻中,然后你使用.*?
(這會吸引所有東西,直到matches
: field[cba] = "cba" or (field[cba]
)。我們需要更嚴格的左/右定義,它不能只是“任何角色”。
(?<=^|\(| or | and )(?<left>\S+) matches (?<right>\S+?)(?=\)|$| and | or )
我換了.*?
到\\S+
其中匹配任何不是空白( [^\\r\\n\\t\\f ]
現在它不會吸收左/右捕獲組中的所有不必要的字符。 \\S+
可能不適合你的定義,但它應該讓你開始。
演示: Regex101
我不完全確定你的數據是怎樣的,但我建議這個正則表達式,它獨立於邊界:
(?:(?<left>"[^"]*")|\b(?<left>\S*)) matches (?:(?<right>"[^"]*")|(?<right>\S*[^)\s]))
我正在利用C#允許在這里使用相同名稱進行捕獲的事實。 左右兩部分幾乎相同。
(?: => Non-capture group
(?<left> => Left capture begin
"[^"]*" => Double quotes, non-quote characters then double quotes
) => End left capture
| => OR
\b => Word boundary
(?<left> => Begin other left capture if first failed
\S* => Capture non-space characters (if your parts break on multiple lines, you can use [^"]* instead
) => End left capture
) => End non-capture group
regex101演示 (我更改了命名的捕獲,因為PCRE不支持相同的名稱捕獲組)
如果字邊界導致的問題(例如,當你有一個不帶有開始部分"
或\\w
字符,你可以使用下面的正則表達式來代替:
(?:(?<left>"[^"]*")|\s\(?(?<left>\S*)) matches (?:(?<right>"[^"]*")|(?<right>\S*[^)\s]))
哪個使用\\s\\(?
而不是\\b
如果你想堅持你提到的界限,你將不得不知道零件中究竟是什么,或者什么不可以。 例如,如果
field["abc"] in field matches field["cba"] in field
是有效的,部分在field["abc"] in field
和field["cba"] in field
,然后它是另一個復雜。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.