我有一个格式为@@@substring1@@@substring2
的字符串,它来自一个黑盒。substring1
可以为空也可以不为空,substring2
始终为非空。@@@
是一个插件,我可以通过黑盒设置来更改它。substring1
和substring2
在它们内部从不包含@@@
。
我需要从这个字符串中得到第一个子字符串,例如。从@@@substring1@@@substring2
我需要得到substring1
,从@@@@@@substring2
我需要得到substring2
。
我的黑盒允许用RE2 regex处理字符串。我不能使用外部的东西,如cut
,sed
,awk
等。是否可以只使用regex?
我的想法如下:
regex@@@([^@]+)
- 将产生1个匹配1组
@@@@@@substring2
-这就是我需要的 - 我将产生2个匹配1组每个
@@@substring1@@@substring2
-这不是我需要的,我只需要1个匹配
RE2 regex中不支持先行/后看Assert(?=re)
、(?!re)
、(?<=re)
、(?<!re)
和\K
语法。
3条答案
按热度按时间vsikbqxv1#
匹配尾部分隔符,这样如果
substring1
匹配,substring2
将无法匹配:试试on regex101.com。
当然,这依赖于一个捕获组。如果您不能使用捕获组,则没有答案。
另外,为了好玩,这里有一个PCRE解决方案:
试试on regex101.com。
.以及上面第一个正则表达式的扩展,它接受包含不超过三个连续
@
的子字符串(参见我对中间表达式here的解释):试试on regex101.com。
aij0ehis2#
@@@substring1@@@substring2
我需要得到substring1
,从@@@@@@substring2
我需要得到substring2
。.....“*
是的,您可以使用以下模式。
你的也是正确的,你只需要定义什么时候停止捕获。
mzsu5hc03#
基于@InSync的工作RE2风味解决方案回答:
(?:^@@@|^)@@@([^@]+).*$
@@@substring1@@@substring2
,它只匹配一个包含substring1
的捕获组${1}
的整个字符串@@@@@@substring2
,它只匹配一个包含substring2
的捕获组${1}
的整个字符串