regex 兼容RE2的正则表达式,从内部包含一组子字符串的字符串中只获取一个子字符串

rmbxnbpk  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(119)

我有一个格式为@@@substring1@@@substring2的字符串,它来自一个黑盒。
substring1可以为空也可以不为空,substring2始终为非空。@@@是一个插件,我可以通过黑盒设置来更改它。substring1substring2在它们内部从不包含@@@
我需要从这个字符串中得到第一个子字符串,例如。从@@@substring1@@@substring2我需要得到substring1,从@@@@@@substring2我需要得到substring2
我的黑盒允许用RE2 regex处理字符串。我不能使用外部的东西,如cutsedawk等。是否可以只使用regex?
我的想法如下:
regex@@@([^@]+)

  • 将产生1个匹配1组@@@@@@substring2-这就是我需要的
  • 我将产生2个匹配1组每个@@@substring1@@@substring2-这不是我需要的,我只需要1个匹配

RE2 regex中不支持先行/后看Assert(?=re)(?!re)(?<=re)(?<!re)\K语法。

vsikbqxv

vsikbqxv1#

匹配尾部分隔符,这样如果substring1匹配,substring2将无法匹配:

@@@           # Match triple '@'
([^@]+)       # followed by a non-empty sequence of non-'@' character, which we capture,
(?:@@@|$)     # then another triple '@' or the end of string.

试试on regex101.com
当然,这依赖于一个捕获组。如果您不能使用捕获组,则没有答案。
另外,为了好玩,这里有一个PCRE解决方案:

^                      # Match at the start of the string
(?(?=@@@(.+?)@@@.+)    #                     if it exists
  @@@\1                # the first substring
|                      # or
  @{6}\K.+             # the second substring (preceded by 6 '@' which we forfeit).
)                      #

试试on regex101.com
.以及上面第一个正则表达式的扩展,它接受包含不超过三个连续@的子字符串(参见我对中间表达式here的解释):

^(?:@@@)?@@@
((?:@(?:@(?:[^@]|$)|[^@]|$)|[^\n@])+)
(?:@@@|$)

试试on regex101.com

aij0ehis

aij0ehis2#

  • ".我需要从这个字符串中得到第一个子字符串,例如。从@@@substring1@@@substring2我需要得到substring1,从@@@@@@substring2我需要得到substring2。...

..“*
是的,您可以使用以下模式。

@{3,6}(.+?)(?:@|$)

你的也是正确的,你只需要定义什么时候停止捕获。

@@@([^@]+?)(?:@|$)
mzsu5hc0

mzsu5hc03#

基于@InSync的工作RE2风味解决方案回答:
(?:^@@@|^)@@@([^@]+).*$

  • 对于@@@substring1@@@substring2,它只匹配一个包含substring1的捕获组${1}的整个字符串
  • 对于@@@@@@substring2,它只匹配一个包含substring2的捕获组${1}的整个字符串

相关问题