Условный поиск по регулярному выражению - PullRequest
2 голосов
/ 22 августа 2011

Я пытаюсь создать код регулярных выражений в Java, который будет иметь условный поисковый термин.

Что я имею в виду, скажем, у меня есть 5 слов; дерево, машина, собака, кошка, птица. Теперь я хотел бы, чтобы выражение выполняло поиск этих терминов, однако требуется только для совпадения с 3 из пяти, и это может быть любое из 5, которое оно выберет для сопоставления.

Я думал, что, возможно, использование обратной ссылки? (3) сработает, но, похоже, не сработает.

Стандартный необязательный поиск (?) Также не сработает, поскольку все термины являются необязательными, однако необходимое количество совпадений - нет. По сути, есть ли способ создать строку, которая должна быть на 50% (или любой процент) правильной, чтобы обеспечить совпадение?

Кто-нибудь случайно знал или мог указать мне правильное направление?

(я надеюсь, что это будет работать на стороне клиента, если это возможно)

Ответы [ 3 ]

2 голосов
/ 22 августа 2011

Должно ли это быть автономное регулярное выражение без дополнительного кода?Простое циклическое тестирование каждого слова и подсчет совпадений должны сделать это отлично.Псевдокод, предполагая, что вы хотите N уникальных совпадений (вы также можете поменять тест подстроки с помощью регулярного выражения, неважно, как вы определяете совпадения, пока вы не учитываете количество уникальных совпадений из регулярного выражения):

bool has_N_words(int n, string[] words, string text) {
    int matches = 0;
    foreach word in words {
        if (word.substringOf(text)) counter++
        if (counter >= n) return true
    }
    return false
}

Мне кажется, это единственный (за исключением умопомрачительного использования непонятных расширений регулярных выражений - не то, чтобы я что-то имел в виду, я просто снова и снова удивлялся тому, что позволяют современные реализации регулярных выражений) сделать это с помощью регулярного выражениявыглядит следующим образом:

  1. Перечисление всех уникальных (игнорируя порядок или не зависящий от реализации, см. ниже) перестановок слов
  2. Для каждой перестановки создайте под Регулярное выражение, соответствующее строкесодержащие эти слова, либо
    1. , соединяющим первые три слова с .*? (для этого требуются все уникальные перестановки)
    2. с использованием трех утверждений, таких как (?=.*word) (это позволяет отбрасывать комбинации слов, которые произошлираньше в другом порядке)
  3. Объедините все под-регулярные выражения вгигант или.

Это нецелесообразно делать вручную, безобразно и сложно (как в вычислительной сложности, а не в программировании), чтобы делать автоматически, и неэффективно, а также довольно хакерски в любом случае.

0 голосов
/ 26 августа 2011
(?i)(?s)(.*(tree|car|dog|cat|bird)){3,}?.*

(? I) для регистра без учета регистра и (? S) для сопоставления новых строк с. * Также, поскольку вы просматриваете электронные письма.
The?в конце квантификатор неохотно.

Я на самом деле не пробовал.

0 голосов
/ 22 августа 2011

Я не понимаю, почему вы хотите сделать это с помощью регулярного выражения, но если вам действительно нужно, чтобы оно было регулярным выражением:

/ (дерево | автомобиль | собака | кот | птица) /

Тогда посчитайте совпадения, которые вы получите от этого ...

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