正则表达式,如果只包含字符串一次,则匹配文本

dee*_*mon 7 regex string

我想编写一个匹配文本的正则表达式,如果它只包含一个字符串一次.文本必须<scr>只包含一次.这里有些例子:

hello-<scr>Keephello-endofstring //好; <scr>发生一次

test-<scr>bla<scr>bla-end //不好; <scr>发生2次

hello-Keephello-end //不好; <scr>没有发生

我尝试使用以下正则表达式:

((?:(?<!<scr>).)*<scr>(?:(?!<scr>).)*)
Run Code Online (Sandbox Code Playgroud)

第一个负面的外观确保<scr>不会发生.
不是<scr>必须遵循.
在此之后,负向前瞻确保不再<scr>遵循.

这是行不通的.
我想知道如何用正则表达式完成这项工作?(附说明)

Wik*_*żew 5

要检查文本是否仅包含某个子字符串一次,您需要检查 match 所有不构成 的字符<scr>,然后 match <scr>,并使用负向前查找来检查是否没有<scr>进一步的字符,并消耗所有字符。另外,行/字符串边界^/$是必须的:

^(?:(?!<scr>).)*<scr>(?!.*<scr>).*$
Run Code Online (Sandbox Code Playgroud)

查看演示

解释

  • ^- 行的开头(当m多行选项打开时)
  • (?:(?!<scr>).)*- 一个非捕获组来匹配前面没有的每个字符(不是换行符 - 为此,您还需要添加s单行选项)<scr>
  • <scr>- 我们的文字<scr>
  • (?!.*<scr>)<scr>- 我们不再有负面的后向检查
  • .*$- 将其余字符与行尾匹配的子模式。