schindlboeckLi Ответов: 2

Как мне сопоставить определенную строку в C#


Здравствуйте, я ищу регулярное выражение, которое соответствует строке "подпись(10,10,доктор имя фамилия):" что я пытался до сих пор является

Что я уже пробовал:

string pattern = @"signature?\S*\S*\s*[a-zA-ZäÄöÖüÜß]*\)";
string match = @"((Prof. )|(Professor))|(((Dr\. )-Ing\. )|(Dr\. ( [a-zöäü]+\.){0,2})(?!.))|(Dipl\.-[A-Z][a-zöäü]+\.)";
MatchCollection collection = Regex.Matches(searchStr.ToLower(), match, RegexOptions.Multiline);


но это не работает. Есть предложения?
Заранее благодарю вас

Garth J Lancaster

Что на самом деле означает "но это не работает" - мы не можем видеть ваш экран, читать ваши мысли и т. д..

Обычно я использую что-то вроде http://regexstorm.net/tester чтобы проверить регулярное выражение - я получаю это

^подпись\([0-9]{2},[0-9]{2},Доктор\.\s?[a-zA-ZäÄöÖüÜß]*\s?[a-zA-ZäÄöÖüÜß]*\)

как образец для первой попытки.. Кстати, я понятия не имею, что ты пытаешься сделать со своей строкой "матч"

Во-вторых .. вам нужно извлечь части данных, например
Название -&ГТ; доктор
Имя -> Фриц
Фамилия -> Schwarz
?

Если это так, то я предлагаю вам вещь о "именованных захватах" после того, как вы исправите свое основное регулярное выражение - довольно легко найти в google, но по сути

^подпись\([0-9]{2},[0-9]{2},Dr\.\s?(?<FirstName>[a-zA-ZäÄöÖüÜß])*\s?[a-zA-ZäÄöÖüÜß]*\)

Создали бы им захватить под названием "Имя"

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

строка regexPattern = @"
^ // Начало строки
подпись //
\( // открывающая скобка
[0-9]{2} // первое число
, ..
[0-9]{2} // второе число

... "

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

MatchCollection matches = регулярное выражение.Совпадения(например, regexPattern, RegexOptions.Многострочный);


schindlboeckLi

Привет Гарт,
Спасибо за ваше предложение.
не работает просто означает, что он не соответствует. Твое предложение мне тоже не подходит. С моим "матчем" я как-то пытался получить титул... Вот что я получил в качестве первого результата google

Garth J Lancaster

конечно, но, как и в случае с программным обеспечением в целом, вы должны быть конкретны в своих требованиях, и вы опубликовали только один пример данных "- я не мог понять, что ваша строка соответствия была/что вы пытались с ней сделать - обычно "совпадение" - это результат/результирующий набор-пример, который вы дали, действительно работал в этом инструменте, для шаблона, как я его имел... как говорили другие, используйте такой инструмент, как expresso, разбейте регулярное выражение на маленькие кусочки.. вы, конечно, должны быть в состоянии расширить то, что я должен был включить (проф.|Professor|Dr\.|Dipl\.) или как бы я это сделал (?<title>(Prof\.|Профессор|Доктор\.|Дипл\.))

Надеюсь, что в конце концов вы ее разгадали

2 Ответов

Рейтинг:
16

OriginalGriff

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

У нас есть один образец входных данных, и нет реальной идеи, что вы хотите с ним сделать. Так что на самом деле все зависит от тебя.
Я бы предложил начать с тестера регулярных выражений: получить копию Экспрессо[^] - это бесплатно, и он проверяет и генерирует регулярные выражения.
Затем начните с малого и продвигайтесь вверх.
Например, это извлекает все содержимое центра:

(?<=signature\()(?<Content>.*)(?=\))
Затем разбейте это на поля и начните сопоставлять ваши конкретные слова.


schindlboeckLi

Большое спасибо. УР предложение прекрасно работает для меня

OriginalGriff

Всегда пожалуйста!

schindlboeckLi

Эй Оригиналгрифф,
может быть, ты снова сможешь мне помочь. Ваше предложение прекрасно работает,если мой ввод "подпись(10,10, имя)" появляется только один раз в строке. В случае, если в моем тексте есть строка, где она появляется, например, два раза, как
"signature(10,10,name) signature(100,10,newname)" регулярное выражение соответствует всем от 10 до newname. Мне нужен способ захватить содержимое отдельно.
Ты можешь мне намекнуть?

с уважением

OriginalGriff

Добавьте к звезде вопросительный знак - она меняет его с "ноль или больше" на "ноль или больше, как можно меньше"

schindlboeckLi

Большое спасибо!

OriginalGriff

Всегда пожалуйста!

Рейтинг:
1

Patrice T

Всего лишь несколько интересных ссылок, которые помогут построить и отладить регулярное выражение.
Вот ссылка на документацию по регулярным выражениям:
perlre - perldoc.perl.org[^]
Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[^]
Регулярное Средство Выражения Эспрессо [^]
RegExr: Learn, Build, & Test RegEx[^]
Онлайн-тестер регулярных выражений и отладчик: PHP, PCRE, Python, Golang и JavaScript[^]
Этот пример показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение: Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]
Этот сайт также показывает регулярное выражение в красивом графике, но не может проверить, что соответствует регулярному выражению: Regexper[^]