繁体   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