检查Java中字符串中特定符号的特殊排列

时间:2013-12-18 04:38:52

标签: java regex

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

有效安排例如:

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

由管理员编辑的链接不包括特定的字符排列,而只包含具有正则表达式的字符外观!

2 个答案:

答案 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方法,抱歉。


根据您的评论,如果您想接受*121?212*456,您可以使用:

^\\*?\\d+(?:[?*]\\d*|-\\d+)*$

然后将其添加到之前的正则表达式中,如下所示:

^(?:[a-z](?:-[a-z])*|\\*?\\d+(?:[?*]\\d*|-\\d+)*)$