为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米脂 2023-06-08 19:52:54
我正在尝试结合使用“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]*"));    //trueSystem.out.println("blah".matches("[^h|bla]*"));    //falseSystem.out.println("blah".matches("[bla|^n]*"));    //falseSystem.out.println("blah".matches("[^n|bla]*"));    //false//second set attempt - turns out to be the literal textSystem.out.println("blah".matches("(bla|^h)*"));    //falseSystem.out.println("blah".matches("(^h|bla)*"));    //falseSystem.out.println("blah".matches("(bla|^n)*"));    //falseSystem.out.println("blah".matches("(^n|bla)*"));    //false//third set attempt - almost gives the right results, but it's still off somehowSystem.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]*"));  //false所以,最后,我想知道以下几点:我对上述正则表达式的解释是否正确?符合我的规范的一组四个 Java 正则表达式是什么?(可选)我是否在我的正则表达式中犯了其他错误?关于模糊要求,我只想提出以下几点:正则表达式细分可能类似于 ("not [abc]" or "bc")* ,它会匹配任何类似的字符串bcbc...或...字符所在的位置不是as、bs 或cs。我只是选择“blah”作为一般示例,例如“foo”或“bar”。
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

要结合您的标准,请在例如非捕获组中使用单独的替代字符集 [],因此

"[bla|^h]*"将会

(?:[bla]*|[^h]*)+

这类似于“至少出现一次(b,l,a或不是h)”

请记住,匹配*意味着“可能发生”(技术上为零或更多)


查看完整回答
反对 回复 2023-06-08
?
POPMUISE

TA贡献1765条经验 获得超5个赞

“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]*"));  //false

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

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

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


查看完整回答
反对 回复 2023-06-08
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

对于前 2 个条件,您可以使用:

^(?:[bla]|[^h])*$

接下来 2 你可以使用:

^(?:[bla]|[^n])*$

正则表达式详细信息:

  • ^: 开始

  • (?:: 启动非捕获组

    • [bla]: 匹配其中之一b or l or a

    • |: 或者

    • [^h]: 匹配任何不是的字符h

  • )*: 结束非捕获组,匹配0个或多个该组

  • $: 结束 正则表达式演示

请注意,对于.matches,锚点是隐式的,因此您可以省略^$


查看完整回答
反对 回复 2023-06-08
  • 3 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信