Java正则表达式不适用于可能值的操作数组

时间:2016-09-29 19:07:59

标签: java regex string

我正在尝试编写一个Java方法,该方法将确定(true或false)特定String是否与animal<L_OPERAND,R_OPERAND>的正则表达式匹配,其中L_OPERAND可以是以下任何值:{{ 1}},dogcatsheep可以是以下任意一个值:R_OPERANDred。所有值都是大小写和空格敏感

一些例子:

blue

到目前为止我的最佳尝试:

animal<fizz,cat>          =>    false; fizz is not a valid L_OPERAND value
animAl<dog,blue>          =>    false; animAl contains an upper-case char (illegal)
animal<dog,sheep>         =>    false; sheep is not a valid R_OPERAND value
animal<dog, blue>         =>    false; contains whitespace between ',' and 'blue' (no whitesapce allowed)
animal<dog,blue>          =>    true; valid
animal<cat,red>           =>    true; valid
animal<sheep,blue>        =>    true; valid

虽然我没有得到任何例外,但我传入的每种类型的输入字符串(public class RegexExperiments { public static void main(String[] args) { boolean b = new RegexExperiments().isValidAnimalDef("animal<dog,blue>"); System.out.println(b); } public boolean isValidAnimalDef(String animalDef) { String regex = "animal<[dog,cat,sheep],[red,blue]>"; if(animalDef.matches(regex)) { return true; } else { return false; } } } )都得到false。显然我的正则表达式很糟糕。谁能找到我出错的地方?

3 个答案:

答案 0 :(得分:1)

您的问题在[dog,cat,sheep][red,blue]结构中。 []表示一个字符类,它匹配内部包含的单个字符。对于第一个,这将是,acdeghopst,而对于第二个,bdelru。因此,您目前匹配animal<d,b>甚至animal<,,,>等字符串。

你所追求的是分组结构和交替的混合。 |提供了轮换,例如dog|cat|sheep将与dogcatsheep匹配。如果您希望在更大的模式中进行此更改,则必须将其包含在组内。 (对于本例)最简单的分组结构是一个以(开头并以)结尾的捕获组。

您的最终模式可能是animal<(dog|cat|sheep),(red|blue)>

答案 1 :(得分:0)

尝试

String regex = "animal<(dog|cat|sheep),(red|blue)>";

答案 2 :(得分:0)

您可以使用RegEx var GetFractionOne = new Regex(@"(?<=class=""desktop-hdn"">SP )(.*?)(?=/)").Matches(set); var GetFractionTwo = new Regex(@"(?<=[0-9]/)(.*?)(?=</strong>)").Matches(set);

<强>输出

animal<(dog|cat|sheep),(red|blue)>

<强>代码

false
false
false
false
true
true
true