Regexp:substring后跟字符

时间:2015-09-29 19:46:58

标签: javascript regex node.js

假设一个正则表达式应该对包含子串hello的任何字符串测试为true,后跟任何不以!或几个!开头的字符串。

清晰的一些例子:

var regExp = /someExpression/;

regExp.test("hello"); // → true
regExp.test("hello!"); // → false
regExp.test("hello!!"); // → false
regExp.test("hello!sdkfjhsdfjkh"); // → false
regExp.test("hellos!dkfjhsdfjkh"); // → true
regExp.test("hello-!"); // → true
regExp.test("hello w34~342`!!"); // → true

我尝试了几种方法,这是我最好的方法:

var regExp = /.*hello[^!].*/;

这对我能提出的所有案例都有效,但只有一个:"hello"

在这种情况下,[^!]需要一个字符。

我如何改进这个正则表达式,以便它也适用于这种情况呢?

感谢任何形式的帮助。

编辑 - 奖励积分:

hello前面跟!相同,因此hello被接受,但!hello不被接受。

3 个答案:

答案 0 :(得分:3)

你需要使用负面预测而不是否定字符类(仍然匹配,消耗字符):

var regExp = /.*hello(?!!).*/;

请参阅regex demo

regular-expressions.info处查看更多详情:

  

否定前瞻是必不可少的,如果您希望匹配其他内容的内容。在解释字符类时,本教程解释了为什么不能使用否定字符类来匹配q而不是u。否定前瞻提供了解决方案:q(?!u)。负前瞻构造是一对括号,左括号后跟一个问号和一个感叹号。

编辑:

由于JS正则表达式引擎不支持后视,您需要匹配(^|[^!])hello(其中(^|[^!])匹配字符串的开头或!以外的符号)然后执行任何操作你需要使用JS字符串方法来处理它。

答案 1 :(得分:1)

只有这些情况,否定/hello!/就可以了:

var regExp = /hello!/;

!regExp.test("hello"); // → true
!regExp.test("hello!"); // → false
!regExp.test("hello!!"); // → false
!regExp.test("hello-!"); // → true
!regExp.test("hello w34~342`!!"); // → true

请参阅:https://regex101.com/r/xI1mG0/1

答案 2 :(得分:0)

使用字符串末尾的简单替换:

/hello([^!]|$)/.test(str);