簡體   English   中英

正則表達式與lookbehind和lookahead與命名組匹配

[英]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在你的前瞻中,然后你使用.*? (這會吸引所有東西,直到matchesfield[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 fieldfield["cba"] in field ,然后它是另一個復雜。

暫無
暫無

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

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