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)
  • \b\b
    对我的示例执行1507个步骤,并随着字符串中字符数的增加而增加->O(n)
空正则表达式(替代解决方案)
如果您的正则表达式引擎接受它,那么最好也是最简单的永远不匹配任何东西的正则表达式可能是:一个空正则表达式

\^
不是
不是
不是
,它是一个文本
^
。如果您不想匹配任何东西,那么出于什么原因需要正则表达式?@Francisco业务原因,更易于部署;-)如果用于验证的正则表达式是从表单条目的另一部分派生的,那么最好有一个默认正则表达式,如果表单尚未完全填充,它将始终失败。这比有一个特例要容易得多。似乎有效!但是这个构造(?@Erick,请阅读本页了解有关环视操作符的信息:@JS Bang刚刚开始阅读,听起来很高级,但很有必要。感谢您的解决方案!更有效的是:
(?!)
-
*
无论如何都是可选的。@leorleor但是
(?!)
将匹配一个空字符串,而带有
*
的版本将不匹配。如果您没有说明您使用的正则表达式变量,请确保它支持{}作为重复计数,然后再尝试此操作。它在Python中工作。这是通常的解决方案,比lookaround更受广泛支持。好的,有一个“常用解决方案”很有趣对这件事。=)@MichaelH。它实际上非常有用。比如说,我有一个带有“hide regex”参数的CLI,用于从输出中排除项。我希望此选项在默认情况下处于禁用状态。因此,我可以在默认情况下将该值设置为空,并具有额外的逻辑,以便仅在用户提供该值时启用匹配——或者简单地将
\b\b
设置为默认值。可能更有效:
^\b$
。也许这两者的结合在emacs
^\b\b$
中也能起作用。消极的前瞻解决方案也很好:我认为随着regexp的发展,人们对
(?!*)
的理解会更好<代码>$which
有WTF因子;)这个答案更具可移植性,因为它也适用于没有前瞻性的正则表达式引擎,尽管我认为它仍然可以匹配一些多行模式。我同意
$whatever
是一个奇怪的正则表达式,主要是因为它看起来像一个变量扩展。但是,同样的技术反过来也适用——在行首之前尝试匹配某些内容:
whatever^