Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式,以匹配除带有周围前缀的字符串以外的任何字符_Regex_Regex Lookarounds - Fatal编程技术网

Regex 正则表达式,以匹配除带有周围前缀的字符串以外的任何字符

Regex 正则表达式,以匹配除带有周围前缀的字符串以外的任何字符,regex,regex-lookarounds,Regex,Regex Lookarounds,我正在尝试创建一个正则表达式,它将验证输入以匹配任何字符,但它应该排除由前缀包围的输入(即{}..}、{@..}或{$..}) 举个例子: 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

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

举个例子:

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
这应该可以通过使用负面环视来实现,大致如下:

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

任何帮助都将不胜感激:)

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

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

第一个“组”是“代码> {(::[ $@α])<代码>,它查找开头前缀,然后<代码> >代码>以匹配中间的所有内容和<代码>(?:[ $(@)] ] /<代码>以匹配结束后缀。

请注意,它不允许出现以下情况:

{$Hello Mars$} how are you?
如果您希望它也接受这一点,请添加线端锚点:

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

您可以使用character类来使用不同的符号
[@$#]
,并且比在侧边使用多个负环视框或
运算符短:)

编辑:要防止出现类似
{#免费文本,这很好$}
的情况,您可以使用:

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

第二个版本


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

感谢您的回答和解释,现在一切都有意义了;不要使用多个负lookaround或|运算符,这在使用上要简单得多!几乎但不正确,“{#免费文本,这很好$}”,这将被视为排序文本…@TomerW很好。我编辑了我的答案来提供这个案例。现在它是完整的和惊人的:)那
{{那是什么文本?$}
那是封闭的还是自由的文本?这是自由的文本,我只寻找用{#…}、{@…}或{$$}封闭的文本
^(?!\{([$@#]).*\1\}$).*