2009-05-04 4 views
1

Прежде чем задать этот вопрос, у меня есть проблема с Google для этой проблемы, и я просмотрел все связанные с StackOverflow вопросы.C# regex соответствует только частим полных слов в строке

Проблема довольно просто

У меня есть строка «Организация Североатлантического договора»

У меня есть образец «а. * Г», на данный момент он будет соответствовать

север ATLATIC ДОГОВОР оРГАНИзАЦИя

Но мне нужно, чтобы соответствовать только слова целиком (например оРГАНИзАЦИя)

Я пробовал «\ ба z \ b "и" \ Ba z \ B "как шаблон, но я думаю, что не совсем понял его

Как изменить шаблон, чтобы соответствовать полным словам, содержащим эту строку (без соответствия нескольких слова)

Образцы создаются «на лету», пользователь вводит * z, и мое приложение переводит его в шаблон, который соответствует частям полных слов в строке.

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

Спасибо!

+0

Современные решения отличные, но для них требуется синтаксический анализ строк, я ищу решение для стиля строки препинг/append. Спасибо. –

ответ

4

ANIZ в организации не полное слово - это часть слова. Ваш шаблон btw - это не то, что вы написали - a*z не соответствовал бы описанию; вы, вероятно, используете вместо этого a.*z. Итак, попробуйте a[^ ]*z, чтобы он не соответствовал пробелам. Если есть другие символы, кроме пробелов, которые вы не хотите сопоставлять, например. некоторые виды пунктуации, конечно же, вставляют их в конструкцию [^...].

+0

Вы правы. Пожалуйста, посмотрите на мое редактирование ... Спасибо! –

3
"a[^\s]*z" 

Это означает «a», за которым следует любое количество небелых символов, за которым следует «z».

EDIT: Вы, кажется, хотите, чтобы '*' интерпретировался как символ подстановки. Таким образом, пользователь не должен вводить регулярное выражение, а строку с определенными подстановочными знаками. Вы можете перевести эти символы подстановки в регулярное выражение, рассуждая о предполагаемом значении. Предположим, что «*» должен означать «ноль или более символов, которые не являются пробелами». Вы заменяете этот символ, затем с соответствующим регулярным выражением:

 
         [^\s]* 
         `-.-´| 
    Character class-----´ `---Zero or more of these 

    '\s': "Whitespace" 
    Inside Character class: if it starts with '^': "not" 

Возможно, вы также захотите определить '?' как сопоставление точно одного символа без пробелов. Это тот же класс символов, но вы опускаете '*' в конце.

Итак, что вы делаете, это регулярное выражение замены «*» с «[^\s]*» и «?» с «[^\s]».

+0

Пожалуйста, посмотрите на мое редактирование..Thank You –

1

это то, что вы ищете:

new Regex(@"\b[^ ]*a[^ ]*z[^ ]*\b"); 

это соответствует только одно слово (пробелы не допускаются) - но все одно.Вы можете перевести своих пользователей в такое регулярное выражение - просто замените * на [^] * - он работает даже с несколькими подстановочными знаками.

1

Не относится к вашему вопросу напрямую, но вы можете захотеть проверить инструмент визуализации RegEx, который показывает полученные результаты на основе ввода текста и заданного регулярного выражения.

Такой инструмент очень полезен для поиска правильного рисунка, который может быть довольно сложным. Хороший инструмент, специализированный для .net RegEx, - RegExLab, немного старше, но неплохо показывает, что именно соответствует вашему регулярному выражению. Поскольку страница находится на немецком языке, просто нажмите ссылку regexlab.006.zip. Исходный код также включен.

+0

Я использую http://regexplib.com/RETester.aspx, но ваш инструмент проще в использовании. Спасибо. –

1
Regex reWord = new Regex("\\b[A-Za-z]*?(a.*z)[A-Za-z]*\\b"); 

... это вернет «Организацию Атлантического договора» с захватом от a. * z "Антиконтинентальный договор".

Проблема присуща в методе - если вы не разобрать пользователя прилагаемое «регулярное выражение» из в * г (или * г, что не совсем ясно, из Вашего поста.) По необходимости модифицировать * к [^ \ s] * ? как предлагает Сванте (или, может быть, \ w *?), вы собираетесь собирать гораздо больше персонажей, чем вам нравится.

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

Regex reWord = new Regex("\\b\\w*?(a\\w*?z)\\w*\\b"); 

... вернется только «Организация».

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

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

Смежные вопросы