正则表达式*不*匹配任何字符

Eri*_*ick 37 regex

我知道这是一个非常奇怪的目标但是对于我们的系统中的一个快速和脏的修复,我们确实需要不过滤任何输入并让腐败进入系统.

我现在的正则表达式是" \^.*"

问题在于它与计划中的字符不匹配...但是对于一个匹配它确实有效.使它不起作用的字符串是^ @jj(基本上任何有^ ...的东西).

现在不匹配任何角色的最佳方法是什么?我正在考虑删除\  但只是这样做会将"不"变成"开始"......

JSB*_*ոգչ 66

^除了字符类([])之外,字符并不意味着"不" .如果你想不匹配任何东西,你可以使用匹配任何东西的负向前瞻:(?!.*).

  • 似乎有效!但是这个构造 (?! <= ) 对我来说很奇怪,它到底意味着什么? (2认同)
  • 更高效:`(?!)` - 无论如何,`.*` 是可选的。 (2认同)
  • @leorleor但是`(?!.?)`将匹配一个空字符串,而带有`.*`的版本则不匹配. (2认同)

pol*_*nts 48

一个简单而廉价的正则表达式永远不会匹配任何东西就是匹配一些简单无法比拟的东西,例如:\b\B.

这是根本不可能为这个正则表达式匹配,因为它是一个矛盾.

参考

  • 好吧,有趣的是,这是一个"通常的解决方案".=) (8认同)
  • 这是通常的解决方案,比外观更广泛支持. (4认同)

fat*_*oku 13

另一个非常好的支持和快速模式将无法匹配任何保证恒定时间的模式:

$unmatchable pattern $anything goes here 等等

$当然表明了行尾.没有任何角色可以追踪,$因此不可能进行进一步的状态转换.另外一个优点是您的模式直观,自我描述和可读性!


aeo*_*eon 8

太棒了;最可移植和最有效的正则表达式从不匹配任何东西是$-行尾后跟一个字符


不可能的正则表达式

最可靠的解决方案是创建一个不可能的正则表达式。有许多不可能的正则表达式,但并非所有都那么好。

首先,您要避免“先行”解决方案,因为某些正则表达式引擎不支持它。

然后你想确保你的“不可能的正则表达式”是有效的,并且不会采取太多的计算步骤来匹配......什么都没有。

我发现它$-具有恒定的计算时间( O(1) ),并且无论文本大小如何(https://regex101.com/r/yjcs1Z/3 ),都只需要两步即可计算。

用于比较:

  • $^两者$.都需要 36 步来计算 -> O(1)
  • \b\B在我的样本上需要 1507 步,并且随着字符串中字符数的增加而增加 -> O(n)

空正则表达式(替代解决方案)

如果您的正则表达式引擎接受它,则永远不匹配任何内容的最佳和最简单的正则表达式可能是:空的正则表达式