我正在尝试编写一个Java方法,该方法将确定(true或false)特定String是否与animal<L_OPERAND,R_OPERAND>
的正则表达式匹配,其中L_OPERAND
可以是以下任何值:{{ 1}},dog
,cat
和sheep
可以是以下任意一个值:R_OPERAND
,red
。所有值都是大小写和空格敏感。
一些例子:
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
。显然我的正则表达式很糟糕。谁能找到我出错的地方?
答案 0 :(得分:1)
您的问题在[dog,cat,sheep]
和[red,blue]
结构中。 []
表示一个字符类,它匹配内部包含的单个字符。对于第一个,这将是,acdeghopst
,而对于第二个,bdelru
。因此,您目前匹配animal<d,b>
甚至animal<,,,>
等字符串。
你所追求的是分组结构和交替的混合。 |
提供了轮换,例如dog|cat|sheep
将与dog
或cat
或sheep
匹配。如果您希望在更大的模式中进行此更改,则必须将其包含在组内。 (对于本例)最简单的分组结构是一个以(
开头并以)
结尾的捕获组。
您的最终模式可能是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