Regex 正则表达式到*不*匹配任何字符
我知道这是一个很奇怪的目标,但是为了快速而肮脏地修复我们的一个系统,我们不需要过滤任何输入,让腐败进入系统 我的当前正则表达式是“Regex 正则表达式到*不*匹配任何字符,regex,Regex,我知道这是一个很奇怪的目标,但是为了快速而肮脏地修复我们的一个系统,我们不需要过滤任何输入,让腐败进入系统 我的当前正则表达式是“\^.” 问题是它与计划中的字符不匹配。。。但对于一场比赛来说,它确实有效。使其无法工作的字符串是^@jj(基本上是任何具有^…)的字符串 现在不匹配任何字符的最佳方式是什么?我正在考虑删除\,但只有这样做才能将“not”转换为“start with” 除了字符类([])内的字符外,^字符并不表示“不”。如果您不想匹配任何内容,可以使用与任何内容匹配的负前瞻:(?!*
\^.
”
问题是它与计划中的字符不匹配。。。但对于一场比赛来说,它确实有效。使其无法工作的字符串是^@jj(基本上是任何具有^…)的字符串
现在不匹配任何字符的最佳方式是什么?我正在考虑删除
\
,但只有这样做才能将“not”转换为“start with” 除了字符类([]
)内的字符外,^
字符并不表示“不”。如果您不想匹配任何内容,可以使用与任何内容匹配的负前瞻:(?!*)
您根本不想匹配任何内容吗?Neg lookarounds看起来很明显,但可能会很慢,或者作为替代方法,^$
(仅匹配空字符串)?^仅当它在类中时(例如[^a-z]表示除a-z以外的任何内容)。您已使用反斜杠将其转换为文字^
你想做的是[^]*,但那是不合法的。你可以试试类似的东西
" {10000}"
它正好匹配10000个空格,如果超过最大输入长度,则永远不应该匹配。与其尝试不匹配任何字符,为什么不匹配所有字符<代码>^.*$应该可以做到这一点。如果必须不匹配任何字符,请尝试
^\j$
(当然,假设您的正则表达式引擎在提供无效字符类时不会抛出错误。如果是,请尝试^()$
。对RegexBuddy进行快速测试表明,这可能会起作用。一个简单而廉价的、永远不会匹配任何东西的regex就是要匹配一些根本不匹配的东西,例如:\b\b
这个正则表达式根本不可能匹配,因为它是矛盾的
工具书类
-
是\B
的否定版本\B
在\B
不匹配的每个位置匹配\B
$不匹配模式
$任何东西都在这里
等等
$
当然表示行尾。字符不可能在$
之后,因此不可能进行进一步的状态转换。另外的优点是,您的模式直观、自描述且可读
((?iLmsux))
尝试此操作,它仅在字符串为空时匹配。tldr;最方便、最高效的从不匹配任何内容的正则表达式是
$-
(行尾后跟一个字符)
不可能正则表达式 最可靠的解决方案是创建一个不可能的正则表达式。有很多不可能的正则表达式,但不是所有的都一样好 首先,您希望避免“前瞻”解决方案,因为某些正则表达式引擎不支持它 然后你要确保你的“不可能的正则表达式”是有效的,并且不会花费太多的计算步骤来匹配…什么都不匹配。 我发现
$-
有一个恒定的计算时间(O(1)),并且无论文本大小,只需两个步骤即可计算()
作为比较:
和$^
都需要36个步骤来计算->O(1)$。
对我的示例执行1507个步骤,并随着字符串中字符数的增加而增加->O(n)\b\b
如果您的正则表达式引擎接受它,那么最好也是最简单的永远不匹配任何东西的正则表达式可能是:一个空正则表达式
\^
不是不是不是,它是一个文本^
。如果您不想匹配任何东西,那么出于什么原因需要正则表达式?@Francisco业务原因,更易于部署;-)如果用于验证的正则表达式是从表单条目的另一部分派生的,那么最好有一个默认正则表达式,如果表单尚未完全填充,它将始终失败。这比有一个特例要容易得多。似乎有效!但是这个构造(?@Erick,请阅读本页了解有关环视操作符的信息:@JS Bang刚刚开始阅读,听起来很高级,但很有必要。感谢您的解决方案!更有效的是:(?!)
-*
无论如何都是可选的。@leorleor但是(?!)
将匹配一个空字符串,而带有*
的版本将不匹配。如果您没有说明您使用的正则表达式变量,请确保它支持{}作为重复计数,然后再尝试此操作。它在Python中工作。这是通常的解决方案,比lookaround更受广泛支持。好的,有一个“常用解决方案”很有趣对这件事。=)@MichaelH。它实际上非常有用。比如说,我有一个带有“hide regex”参数的CLI,用于从输出中排除项。我希望此选项在默认情况下处于禁用状态。因此,我可以在默认情况下将该值设置为空,并具有额外的逻辑,以便仅在用户提供该值时启用匹配——或者简单地将\b\b
设置为默认值。可能更有效:^\b$
。也许这两者的结合在emacs^\b\b$
中也能起作用。消极的前瞻解决方案也很好:我认为随着regexp的发展,人们对(?!*)
的理解会更好<代码>$which
有WTF因子;)这个答案更具可移植性,因为它也适用于没有前瞻性的正则表达式引擎,尽管我认为它仍然可以匹配一些多行模式。我同意$whatever
是一个奇怪的正则表达式,主要是因为它看起来像一个变量扩展。但是,同样的技术反过来也适用——在行首之前尝试匹配某些内容:whatever^