Требуется: очень простой API Java RegExp - PullRequest
3 голосов
/ 10 мая 2010

Я устал писать

Pattern p = Pattern.compile(...
Matcher m = p.matcher(str);
if (m.find()) {
   ...

Снова и снова в моем коде. Я собирался написать вспомогательный класс, чтобы сделать его более аккуратным, но потом мне стало интересно: есть ли библиотека, которая пытается обеспечить более простой фасад для регулярных выражений в Java?

Я думаю о чем-то в стиле commons-lang и Гуава .

РАЗЪЯСНЕНИЕ : На самом деле я надеюсь на некоторую общую библиотеку, которая сделает работу с регулярными выражениями более упорядоченной, например, как это делает perl. Код выше был только примером.

Я думал о чем-то, что я мог бы использовать так:

for (int question : RegEx.findAllInts("SO question #(\\d+)", str)) {
   // do something with int
}

Опять же, это всего лишь пример одной из многих вещей, которые я хотел бы иметь. Наверное, даже не хороший пример. API трудны.

ОБНОВЛЕНИЕ : Я думаю, что ответ "Нет". Спасибо за все ответы, приветствуем.

Ответы [ 7 ]

2 голосов
/ 10 мая 2010

Существует библиотека Java, которая имеет функцию расширения встроенной библиотеки регулярных выражений Java. Взгляните на RegExPlus . Я лично не пробовал. Но надеюсь, что это поможет.

2 голосов
/ 10 мая 2010

Да, меня тоже всегда беспокоит то, что мне приходится писать столько шаблонов для выполнения таких распространенных задач. Я думаю, это очень помогло бы, если бы в String была пара методов, таких как

public String findFirst(String regex)

public String[] findAll(String regex)

Они представляют две наиболее часто выполняемые операции регулярного выражения, которые еще не поддерживаются методами String. Если бы у нас были такие, плюс средство динамической замены, такое как Rewriter, мы могли бы почти забыть о Pattern и Matcher. Они понадобятся нам только тогда, когда мы пишем что-то действительно сложное, например, метод findAllInts(). : D

2 голосов
/ 10 мая 2010

Pattern должен быть скомпилирован только один раз; сохраните его в окончательном статическом поле. Это по крайней мере спасает вас от повторения во время кодирования во время выполнения этого шага. То есть этот шаг не всегда должен идти рука об руку с созданием Matcher по соображениям производительности.

В вашем примере кажется, что RegEx в любом случае играет роль Matcher объекта. Я надеюсь, что это не должен быть класс со статическим методом, поскольку он не будет работать в многопоточной среде - тогда вызовы find и getInt не связаны. Так что вам все равно нужно Matcher.

Итак, вы вернулись именно к API Java, когда учитываются соображения проектирования. Нет, я не думаю, что есть более короткий способ сделать это правильно и эффективно .

2 голосов
/ 10 мая 2010

Почему бы просто не написать свой собственный метод-обертку? Конечно, вы не должны изобретать велосипед, но другая библиотека также означает другую зависимость.

1 голос
/ 10 мая 2010

Для конкретного примера, который вы приводите, вы можете иметь возможность что-то импровизировать, используя сплиттер Гуавы:

for (String number : Splitter.onPattern("[^\d]+").split(input)) {
    // Do something with the number
}

или, более конкретно, если вы ввели как

SO question #1234, SO Question #3456, SO Question #5678

вы могли бы сделать

for (String number : Splitter.onPattern("(, )? SO Question #").split(input)) {
    // Do something
}

Это немного глупо, но в определенных случаях может делать то, что вам нужно.

1 голос
/ 10 мая 2010

Существует Jakarta Regexp (см. Класс RE). Взгляните на этот старый поток , чтобы узнать о преимуществах пакета RegExp Джакарты над встроенным в RegEx Java.

1 голос
/ 10 мая 2010

Начиная с Java 1.4, вы также можете использовать String.matches (String regex) . Что именно является фасадом вышеупомянутого кодекса.

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