我想编写一个正则表达式,如果文本仅包含一次字符串,则该正则表达式与文本匹配。文本必须包含 <scr>
只有一次。以下是一些示例:
hello-<scr>Keephello-endofstring
//好的; <scr>
发生一次
test-<scr>bla<scr>bla-end
//不好; <scr>
出现2次
hello-Keephello-end
//不好; <scr>
没有发生
我尝试使用以下正则表达式:
((?:(?<!<scr>).)*<scr>(?:(?!<scr>).)*)
第一个负向后查找可确保 <scr>
不会发生。
比<scr>
必须遵循。
此后,负向前瞻可确保不再 <scr>
关注。
它不起作用。
我想知道如何使用正则表达式来完成此操作? (附说明)
最佳答案
要检查文本是否仅包含某个子字符串一次,您需要检查是否匹配所有不构成 <scr>
的字符。 ,然后匹配<scr>
,并使用负前瞻检查是否不存在 <scr>
进一步,并消耗所有角色。另外,行/字符串边界 ^
/$
是必须的:
^(?:(?!<scr>).)*<scr>(?!.*<scr>).*$
参见demo
说明:
-
^
- 行开头(如m
多行选项打开) -
(?:(?!<scr>).)*
- 一个非捕获组来匹配每个字符(不是换行符 - 为此,您还需要添加s
单行选项),该字符前面没有<scr>
-
<scr>
- 我们的文字<scr>
-
(?!.*<scr>)
- 我们没有的负面回顾检查<scr>
还有更多 -
.*$
- 将其余字符与行尾匹配的子模式。
关于regex - 如果文本只包含一次字符串,则匹配该文本的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30144801/