Java正则表达式匹配词典的字典范围

时间:2011-06-27 13:21:24

标签: java regex

我查看了各种Java REGEX信息,但找不到我想要的答案:

如何查找两个值(abcdef)之间的所有字符串?

所以,如果我有以下字符串:

abc
acc
ace
amf
def
efg
khp
mlo

我希望得到以下内容,因为它们介于abcdef之间(包括):

abc 
acc
ace
amf
def

2 个答案:

答案 0 :(得分:9)

使用正则表达式(不推荐)

没有直接表达方式。事实上,确定给定数字是否在特定范围内几乎完全相同。 (即,提供匹配123-456范围内的数字的正则表达式。)

您可以使用相当复杂的正则表达式对其进行“编码”。我在这里描述的一个过程:

对于"abc""def"的具体示例,您可以这样写:

  • a紧随其后
    • b后跟c-z
    • c-z后跟任何字符,或
  • b-c后跟任意两个字符,或
  • d后跟
    • a-d后跟任何字符,或
    • e后跟
      • a-f

这是代码:

String pattern = "a(b[c-z]|[c-z][a-z])|[bc][a-z][a-z]|d([a-d][a-z]|e[a-f])";

for (String s: "abc acc ace amf def efg khp mlo".split(" "))
    System.out.println(s + (s.matches(pattern) ? " matches" : ""));

输出:

abc matches
acc matches
ace matches
amf matches
def matches
efg
khp
mlo



使用String.compareTo(推荐)

您应该考虑比较字符串:

"abc".compareTo(s) <= 0 && s.compareTo("def") <= 0

示例:

String lower = "abc", upper = "def";

for (String s: "abc acc ace amf def efg khp mlo".split(" ")) {
    boolean match = lower.compareTo(s) <= 0 && s.compareTo(upper) <= 0;
    System.out.println(s + (match ? " matches" : ""));
}

<强>输出:

abc matches
acc matches
ace matches
amf matches
def matches
efg
khp
mlo

答案 1 :(得分:2)

你正在寻找这样的东西吗? (将“之间”解释为词汇排序而不是父词串中的位置)

public static boolean between(
    final String candidate, final String left, final String right) {
      return left.compareTo(candidate) <= 0 && candidate.compareTo(right) <= 0;
}

测试代码:

public static void main(final String[] args) throws Exception {
    final String[] words = "abc acc ace amf def efg khp mlo".split("\\W+");
    final String left = "abc";
    final String right = "def";
    for (final String word : words) {
        System.out.println(MessageFormat.format("{0}{1}between {2} and {3}",
        word, (between(word, left, right) ? " is " : " is not "), left, right));
    }
}

<强>输出:

  

abc介于abc和def之间   acc介于abc和def之间   ace在abc和def之间   amf介于abc和def之间   def在abc和def之间   efg不在abc和def之间   khp不在abc和def之间   mlo不在abc和def之间