我需要检查字符串是否包含字母和数字的特定排列。
有效安排例如:
X
X-Y
A-H-K-L-J-Y
A-H-J-Y
123
12?
12*
12-17
无效例如:
-X-Y
-XY
*12
?12
我已经在java中编写了这个方法来解决这个问题(但是我对正则表达式没有一些经验):
public boolean checkPatternMatching(String sourceToScan, String searchPattern) {
boolean patternFounded;
if (sourceToScan == null) {
patternFounded = false;
} else {
Pattern pattern = Pattern.compile(Pattern.quote(searchPattern),
Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(sourceToScan);
patternFounded = matcher.find();
}
return patternFounded;
}
如何使用正则表达式实现此要求?
顺便说一下:通过使用java类StringUtils中的方法isNumeric来检查一个字符串,它是否包含数字内容是一个很好的解决方案?
// EDIT
由管理员编辑的链接不包括特定的字符排列,而只包含具有正则表达式的字符外观!
答案 0 :(得分:6)
经过一段时间的努力寻求帮助,回答不断变化的问题,刚刚发现the same was asked yesterday,OP doesn't accept answers to his questions ......我所要留下的只是好晚上先生,祝你好运
第n个答案如下:
第一种模式:[a-z](-[a-z])*
:一个字母,可能后跟更多字母,以-
分隔。
第二种模式:\d+(-\d+)*[?*]*
:一个数字,可能后跟更多数字,以-
分隔,可能以?
或*
结尾。
所以加入他们:^([a-z](-[a-z])*)|(\d+(-\d+)*[?*]*)$
。 ^
和$
标记字符串的开头和结尾。
关于代码的更多评论:您不需要使用Pattern.quote
,而应使用matches()
代替find()
,因为find()
会返回true
如果字符串的任何部分与模式匹配,并且您希望整个字符串:
public static boolean checkPatternMatching(String sourceToScan, String searchPattern) {
boolean patternFounded;
if (sourceToScan == null) {
patternFounded = false;
} else {
Pattern pattern = Pattern.compile(searchPattern, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(sourceToScan);
patternFounded = matcher.matches();
}
return patternFounded;
}
这样称呼:checkPatternMatching(s, "^([a-z](-[a-z])*)|(\\d+(-\\d+)*[?*]*)$")
关于第二个问题,这是StringUtils.isNumeric
的{{3}}:
public static boolean isNumeric(final CharSequence cs) {
if (isEmpty(cs)) {
return false;
}
final int sz = cs.length();
for (int i = 0; i < sz; i++) {
if (Character.isDigit(cs.charAt(i)) == false) {
return false;
}
}
return true;
}
所以不,它没有任何问题,就像它得到的一样简单。但是你需要在你的程序中包含一个外部JAR,如果你只想使用这么简单的方法,我认为这是不必要的。
答案 1 :(得分:1)
我认为你应该首先删除Pattern.quote()
方法,因为这会将输入模式转换为字符串文字;那些在你的背景下并没有用。
为了使有效的安排与字母相符,这样的事情应该有效:
^[a-z](?:-[a-z])*$
对于数字(如果我理解正确的规则):
^\\d+(?:[?*]|-\\d+)*$
如果你想把它们组合起来:
^(?:[a-z](?:-[a-z])*|\\d+(?:[?*]|-\\d+)*)$
我不熟悉Java本身,也不熟悉isNumeric
方法,抱歉。
根据您的评论,如果您想接受*12
或1?2
或12*456
,您可以使用:
^\\*?\\d+(?:[?*]\\d*|-\\d+)*$
然后将其添加到之前的正则表达式中,如下所示:
^(?:[a-z](?:-[a-z])*|\\*?\\d+(?:[?*]\\d*|-\\d+)*)$