Как указать подстановочный знак (для ЛЮБОГО символа) в выражении регулярного выражения c #? - PullRequest
7 голосов
/ 14 июня 2010

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

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

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

Regex guestbookWidgetIDregex = new Regex("GuestbookWidget(' INSERT WILDCARD HERE ', '(.*?)', 500);", RegexOptions.IgnoreCase);

Если кто-нибудь может понять, что я делаю не так, это будет с благодарностью!

Ответы [ 2 ]

17 голосов
/ 14 июня 2010

Подстановочный знак ..
Чтобы сопоставить любое количество произвольных символов, используйте .* (что означает ноль или более .) или .+ (что означает один или несколько .)

Обратите внимание, что вам нужно избегать скобок как \\( и \\). (или \( и \) в строке @"")

7 голосов
/ 14 июня 2010

На точке

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

В C # это указаноиспользуя RegexOptions.Singleline.Вы также можете встроить это как (?s) в шаблон.

Ссылки


На метасимволах и экранировании

. - не единственные метасимволы регулярных выражений.Это:

(   )   {   }   [   ]   ?   *   +   -   ^   $   .   |   \

В зависимости от того, где они появляются, если вы хотите, чтобы эти символы означали буквально (например, . как точка), вам может потребоваться сделать то, что называется«побег».Это делается путем добавления к символу \.

. Конечно, \ также является escape-символом для строковых литералов C #.Чтобы получить литерал \, вам нужно удвоить его в строковом литерале (т. Е. "\\" - строка длиной один).Кроме того, в C # также есть так называемые строковые литералы, заключенные в кавычки * 1044, где escape-последовательности не обрабатываются.Таким образом, следующие две строки равны:

"c:\\Docs\\Source\\a.txt"
@"c:\Docs\Source\a.txt"

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

Ссылки


Для классов символов

Механизмы регулярных выражений позволяют определять классы символов, например, [aeiou] - это класс символов, содержащий 5 гласных букв.Вы также можете использовать метасимвол - для определения диапазона, например, [0-9] - это классы символов, содержащие все 10-значные символы.

Поскольку часто используются цифровые символы, регулярное выражение также предоставляет для него сокращенную запись,что \d.В C # это также будет соответствовать десятичным цифрам из других наборов символов Unicode, если только вы не используете RegexOptions.ECMAScript, где он строго [0-9].

Ссылки

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


Соберите все вместе

Похоже, что следующее будет работать для вас:

      @-quoting          digits_      _____anything but ', captured
          |                   / \    /     \
new Regex(@"GuestbookWidget\('\d*', '([^']*)', 500\);", RegexOptions.IgnoreCase);
                           \/                     \/
                         escape (              escape )

Обратите внимание, что я немного изменил шаблон, чтобы он использовал отрицательный символьный класс вместо сопоставления с подстановочными знаками.Это вызывает небольшое различие в поведении, если вы разрешите экранирование ' во входной строке, но ни один из шаблонов не справится с этим случаем идеально.Однако, если вы не позволяете экранировать ', этот шаблон определенно лучше.

Ссылки

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