RegExp必须有\ w +和\ s +字符

时间:2014-11-19 17:29:45

标签: javascript regex

我一直在尝试创建一个RegExp,确保确定已输入至少一个单词和至少一个空格。我试着用这个:

/\w+\s+/

但这可以确保在空格之后有一个单词。我只是想确保字符串中都有两个。它们不需要符合上述RegExp的顺序。

如何使RegExp工作,但没有匹配订单?

3 个答案:

答案 0 :(得分:6)

/(?=.*?\w)(?=.*?\s)/

?=表示"预见",.*表示"任意数量的字符"

所以"找到任意数量的字符然后\w","找到任意数量的字符和\s"

关于它是如何工作的另一个注意事项是,前瞻是"不匹配",使它可以按任何顺序匹配。

答案 1 :(得分:5)

你有两件事:

  • 是否有单词字符?
  • 有空间吗?

两件事。

  • str.match(/\w/)
  • str.match(/\s/)

那么你为什么要尝试将它们作为一步呢?

if( str.match(/\w/) && str.match(/\s/))

  

我的问题有很多答案。但是,我不想简单地选择一个被投票的那个。请详细解释为什么你的正则表达式有效,也许为什么我的没有。

我的回答提供了最简单的解决方案。任何阅读它的人都非常清楚我们正在检查它是否有单词字符,如果它包含空格字符"。它也很容易扩展,例如,如果你想添加另一个支票。

zyklus'在50Kb输入字符串上进行速度测试时,回答(/(?=.*?\w)(?=.*?\s)/)是最快的。在更常见的情况下(即最多100个字符),这种速度差异实际上是不存在的。它的速度是我答案的两倍,但是" 2 *非常小的数字=非常小的数字"。添加新的测试用例非常容易(只需添加另一个(?=.*something)块),但它的功能却不那么明显。

雅各布的回答((\w+.*\s+)|(\s+.*\w+))确实完全符合你的要求,首先检查是否有单词字符然后是空格字符,然后在失败之前检查相反的方向。它有效,但速度较慢。此外,如果您决定添加新的测试用例,则可以获得(\w+.*\s+.*\d+)|(\w+.*\d+.*\s)|(\s+.*\w+.*\d+)|(\s+.*\d+.*\w+)|(\d+.*\w+.*\s+)|‌​(\d+.*\s+.*\w+)之类的内容。如果你添加第四个测试(24个安排来检查)并且难以辨认,它只会变得更糟。不要使用这个答案。

其他答案是现有答案的变体。

答案 2 :(得分:3)

如果出于某种原因需要在一个RegEx中执行此操作:

(\w+.*\s+)|(\s+.*\w+)

如果您正在使用只允许使用单个正则表达式的库,则可以很方便。