Сопоставление с образцом - поиск строки - PullRequest
1 голос
/ 23 августа 2010

Я пытаюсь разработать формулу, соответствующую следующему шаблону: пример входной строки:

'444'/'443'/'434'/'433'/'344'/'334'/'333'

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

также возможно ли сделать подстановку переменных с помощью регулярных выражений? что означает проверка на 3 символа строки, используя каждый символ в качестве переменной и просто делая приращение / уменьшение для каждого символа? чтобы вам не приходилось указывать конкретные диапазоны номеров (жесткое кодирование строки шаблона) для разных шаблонов?

Есть ли какая-нибудь хорошая библиотека, которую можно использовать для этого? Я работал с классом Pattern в Java.

Если у вас есть какая-либо ссылка, которая будет полезна, пожалуйста, пройдите по ней :) Спасибо.

Ответы [ 3 ]

1 голос
/ 23 августа 2010

Давайте сначала рассмотрим этот шаблон: [34]{3}

[…] - это класс символов , он точно соответствует одному из символов в наборе.{n} - это точное конечное повторение .

Так, [34]{3} неофициально означает «ровно 3 из '3' или '4'».Таким образом, он соответствует "333", "334", "343", "344", "433", "434", "443", "444" и ничему другому.

как строковый литерал, шаблон "[34]{3}".Если вы не хотите жестко кодировать этот шаблон, просто сгенерируйте похожие строки, следующие за этим шаблоном "[…]{n}".Просто введите символы, которые вы хотите сопоставить, в и замените n на нужное число.

Вот пример:

  String alpha = "aeiou";
  int n = 5;

  String pattern = String.format("[%s]{%s}", alpha, n);

  System.out.println(pattern);
  // [aeiou]{5}

Мы уже виделичто шаблон не жестко закодирован, а скорее программно сгенерирован в зависимости от значений переменных alpha и n.В паттерне [aeiou]{5} будут 5 последовательных строчных гласных, например, "ooiae", "ioauu", "eeeee" и т. Д.

Опять не ясно, хотите ли вы просто соответствовать этим типам строк или если онидолжен выглядеть как '…'/'…'/'…'/'…'/'…'.Если последнее желательно, то просто составьте шаблон по своему усмотрению, используя повторение и группирование при необходимости.Вы также можете просто программно скопировать и вставить шаблон 5 раз, если это проще.Вот пример:

  String p5 = String.format("'%s'/'%<s'/'%<s'/'%<s'/'%<s'", pattern);

  System.out.println(p5);
  // '[aeiou]{5}'/'[aeiou]{5}'/'[aeiou]{5}'/'[aeiou]{5}'/'[aeiou]{5}'

Теперь он будет соответствовать строкам вроде "'aeooi'/'eeiuu'/'uaooo'/'eeeia'/'eieio'".

Предостережение

Будьте осторожны с тем, что входит в alpha.В частности, -, [.], &&, ^ и т. Д. Являются специальными метасимволами в определении класса символов Java.Если вы ограничите alpha только цифрами / буквами, то вы, вероятно, не столкнетесь с какими-либо проблемами, но, например, [^a] не НЕ означает «либо '^', либо 'a'».Фактически это означает «что угодно, кроме 'a'. Точный синтаксис класса символов см. В java.util.regex.Pattern.

0 голосов
/ 23 августа 2010

Pattern.Compile принимает String в качестве параметра.Хотя это, вероятно, чаще всего предоставляется в виде строкового литерала, если у вас есть переменные верхней и нижней границ для вашего шаблона, вы можете использовать что-то вроде StringBuilder для построения вашей строки, а затем передать этот результат в Pattern.Compile.

0 голосов
/ 23 августа 2010

Вы можете использовать регулярное выражение:

('\\d{3}'/){6}'\\d{3}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...