Регулярное выражение Java для соответствия лексикографическому диапазону строк - PullRequest
3 голосов
/ 27 июня 2011

Я просмотрел все виды информации Java REGEX и не нашел ответ, который искал:

Как найти все строки, которые находятся между двумя значениями (abc и def)?

Итак, если у меня есть следующие строки:

abc
acc
ace
amf
def
efg
khp
mlo

Я бы надеялся получить следующее, потому что они находятся между abc и def (включая):

abc 
acc
ace
amf
def

Ответы [ 2 ]

9 голосов
/ 27 июня 2011

Использование регулярных выражений (не рекомендуется)

Нет прямого способа выразить это.Фактически это почти идентично выяснению, находится ли данное число в определенном диапазоне.(То есть, предоставление регулярного выражения, совпадающего с цифрами в диапазоне 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
2 голосов
/ 27 июня 2011

Вы ищете что-то подобное?(Интерпретация "между" как лексическое упорядочение, а не как размещение внутри родительской строки)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...