String.Format для создания шаблонов регулярных выражений - PullRequest
1 голос
/ 10 февраля 2012

быстрая рука была бы очень признательна. Я пытаюсь сделать небольшой алгоритм для ввода текста из текстового поля в выражение регулярного выражения. Следующим образом:

    string bar = String.Format(@"^{0}*(q*x|x*q)*", foo.Text);

классу regex передается переменная bar выше и инициализируется при возникновении события. Тем не менее, он возвращает только попадания, когда есть повторяющийся текст. E.G bb в текстовом поле возвращает все результаты, которые начинаются с b, а 1b возвращает совпадения для каждого слова.

??? что-то не так с моим регулярным выражением или моей логикой? (или оба!: P)

РЕДАКТИРОВАТЬ Я пытаюсь сопоставить список строк, загруженных из текстового файла. все слова, которые содержат как q, так и x хотя бы один раз, начиная с букв в текстовом поле. Примеры: arquifoux benzofuroquinoxaline benzoquinoxaline disquixote equiaxe

Ответы [ 4 ]

0 голосов
/ 10 февраля 2012
string bar = string.Format("^(\w+\s+)*{0}\w+(q\w*x|x\w*q)+.*", Regex.Escape(Regfoo.Text)); 

Это должно:

  1. Соответствует началу строки. ^
  2. Совпадение с любым или без полных слов, предшествующих. (\ W + \ S +) *
  3. Соответствует указанному тексту, встречающемуся один раз в начале слова {0}.
  4. Сопоставьте остаток слова, связанного с q, затем x или x, затем q. \ Ш + (д \ ш * х | х \ ш * д) +
  5. Совпадение с другими персонажами. . *
0 голосов
/ 10 февраля 2012

Я думаю, что вы хотите

string bar = String.Format(@"^{0}.*?(q.*?x|x.*?q).*", foo.Text);

. соответствует любому символу. Знак вопроса в .*? просто делает совпадение нежадным (то есть 'q' будет соответствовать первому найденному q), хотя в вашем случае они на самом деле не нужны.

Ваш предыдущий 'q *' соответствует «0 или более символов q».

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

string bar = String.Format(@"^{0}[a-z]*?(q[a-z]*?x|x[a-z]*?q)[a-z]*", foo.Text);

Что соответствует только строчным буквам. (Вы можете передать флаг без учета регистра своему регулярному выражению, чтобы он соответствовал любому регистру).

0 голосов
/ 10 февраля 2012

Вам не хватает некоторых совпадений в регулярном выражении для сопоставления символов между вашими a, q и x.Для сопоставления слов вам понадобится это (\ w вместо. Ограничивать только символами слов)

^{0}\w*(q\w*x|x\w*q)

Возможно, здесь вам здесь не нужно, но хорошо использовать Regex.Пользователь ввел текст перед тем, как вставить его непосредственно в выражение регулярного выражения

0 голосов
/ 10 февраля 2012

Я почти уверен, что ваше регулярное выражение неверно. Я думаю, что вы пропустили некоторые периоды (.) Там до * 100 * *

Если вы сломаете то, что у вас есть: ^{0}*(q*x|x*q)* то есть:

^{0}* <-- starts with 0 or more of whatever the text box had.
(q*x|x*q)* <-- then contains 0 or more of this pattern.

Поскольку вы спрашиваете «0 или больше», оно в основном соответствует чему угодно. Ввод "bb", похоже, сработает, потому что это сделает начальное регулярное выражение: ^bb*, которое разбивается на:

^b <-- starts with 1 letter 'b'
b* <-- followed by 0 or more letter 'b's

Я думаю, что вы хотели:

^{0}.*(q.*x|x.*q)+

Который разбивается на:

^{0} <-- starts with 1 of whatever my text box had
.* <-- then 0 or more of anything
(q.*x|x.*q)+ <-- then 1 or more of q + anything + x, or x + anything + q
...