猿问

在 Java 正则表达式中结合或否定?

我正在尝试结合使用“not”和“or”来生成一组正则表达式匹配,如下所示:


"blah" matching "zero or more of" : "not h"         or  "any in b,l,a" = false 

"blah" matching "zero or more of" : "any in b,l,a"  or  "not h"        = false  

"blah" matching "zero or more of" : "not n"         or  "any in b,l,a" = true  

"blah" matching "zero or more of" : "any in b,l,a"  or  "not n"        = true  

我尝试了以下正则表达式,但它们似乎没有达到我想要的效果。我还包括了我对正则表达式的解释:


//first set attempt - turns out to be any of the characters within?

System.out.println("blah".matches("[bla|^h]*"));    //true

System.out.println("blah".matches("[^h|bla]*"));    //false

System.out.println("blah".matches("[bla|^n]*"));    //false

System.out.println("blah".matches("[^n|bla]*"));    //false

//second set attempt - turns out to be the literal text

System.out.println("blah".matches("(bla|^h)*"));    //false

System.out.println("blah".matches("(^h|bla)*"));    //false

System.out.println("blah".matches("(bla|^n)*"));    //false

System.out.println("blah".matches("(^n|bla)*"));    //false

//third set attempt - almost gives the right results, but it's still off somehow

System.out.println("blah".matches("[bla]|[^h]*"));  //false

System.out.println("blah".matches("[^h]|[bla]*"));  //false

System.out.println("blah".matches("[bla]|[^n]*"));  //true

System.out.println("blah".matches("[^n]|[bla]*"));  //false

所以,最后,我想知道以下几点:

  1. 我对上述正则表达式的解释是否正确?

  2. 符合我的规范的一组四个 Java 正则表达式是什么?

  3. (可选)我是否在我的正则表达式中犯了其他错误?

关于模糊要求,我只想提出以下几点:正则
表达式细分可能类似于 ("not [abc]" or "bc")* ,它会匹配任何类似的字符串bcbc......字符所在的位置不是as、bs 或cs。我只是选择“blah”作为一般示例,例如“foo”或“bar”。


米脂
浏览 143回答 3
3回答

侃侃无极

要结合您的标准,请在例如非捕获组中使用单独的替代字符集 [],因此"[bla|^h]*"将会(?:[bla]*|[^h]*)+这类似于“至少出现一次(b,l,a或不是h)”请记住,匹配*意味着“可能发生”(技术上为零或更多)

POPMUISE

“not h”可以有多种写法:(?!.*h.*)[^h]*“b、l、a 中的任何一个” 1:[bla]*1) 假设您的意思是“只有 b、l、a 之一”,否则问题中的所有 4 个示例都是true结合使用or将是:[^h]*|[bla]*这意味着“必须是一个不包含 的字符串h,或者必须是一个仅由b、l和a字符组成的字符串。在这种情况下, 的顺序|没有区别,因此[^h]*|[bla]*和 的[bla]*|[^h]*作用相同。System.out.println("blah".matches("[bla]*|[^h]*"));  //falseSystem.out.println("blah".matches("[^h]*|[bla]*"));  //falseSystem.out.println("blah".matches("[bla]*|[^n]*"));  //trueSystem.out.println("blah".matches("[^n]*|[bla]*"));  //true

慕工程0101907

对于前 2 个条件,您可以使用:^(?:[bla]|[^h])*$接下来 2 你可以使用:^(?:[bla]|[^n])*$正则表达式详细信息:^: 开始(?:: 启动非捕获组[bla]: 匹配其中之一b or l or a:|: 或者[^h]: 匹配任何不是的字符h)*: 结束非捕获组,匹配0个或多个该组$: 结束 正则表达式演示请注意,对于.matches,锚点是隐式的,因此您可以省略^和$。
随时随地看视频慕课网APP

相关分类

Java
我要回答