我需要检查字符串是否包含字母和数字的特定排列。

有效的安排例如:

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.isNumericcurrent 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/

10-14 12:15
查看更多