我需要检查字符串是否包含字母和数字的特定排列。
有效的安排例如:
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方法,检查字符串是否包含数字内容是一个很好的解决方案?
//编辑
由管理员编辑的链接不包括特定的字符排列方式,而仅包含带有正则表达式的字符外观!
最佳答案
经过一会儿的努力之后,回答了不断变化的问题,才发现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
的current implementation: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,如果您只想使用这种简单的方法,则我认为这是不必要的。
关于java - 检查Java字符串中特定符号的特殊排列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20649737/