1

我正在尝试创建一个正则表达式,它将验证输入以匹配任何字符,但它应该排除用前缀包围的输入(即 {#..#}、{@..@} 或 {$..$})。

给出的例子是:

Free text which is fine // should return true
{#some other text#} // should return false
Text with numbers 671 // should return true
{@Hello world@} // should return false
{$Hello Mars$} // should return false
{$some text which i do not close // should return true

这应该可以通过使用负面环视来实现,类似于:

^(\?!=(\{@[^.]+@\}))(\?!=(\{$[^.]+$\}))(\?!=(\{#[^.]+#\})).*

任何帮助将不胜感激 : )

4

1 回答 1

2

如果你问我,你的语法有点奇怪......我建议:

^(?!\{(?:[$@#]).*(?:[$@#])\}).*

演示

第一个“组”是\{(?:[$@#])查找开始前缀,然后.*匹配中间的所有内容并(?:[$@#])\}匹配结束后缀。

请注意,它不允许以下内容:

{$Hello Mars$} how are you?

如果您希望它也接受这一点,请添加行尾锚:

^(?!\{(?:[$@#]).*(?:[$@#])\}$).*
                            ^

演示

您可以使用字符类来具有不同的符号[@$#],并且比|在侧面具有多个否定环视或运算符要短:)

编辑:为了防止{#Free text which is fine$}'你可以使用的东西:

^(?!\{([$@#]).*\1\}).*

或者

^(?!\{([$@#]).*\1\}$).*

对于第二个版本。

\1是一个反向引用并且引用第一个捕获的组(任何一个$@#)。

于 2013-07-15T08:00:34.927 回答