假设一个正则表达式应该对包含子串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
不被接受。
答案 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
答案 2 :(得分:0)
使用字符串末尾的简单替换:
/hello([^!]|$)/.test(str);