Как я указываю подстановочный знак (для КАКОГО-ЛИБО символа) в c# regex оператор?

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

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

Используемый оператор Regex:

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

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

9
задан Scott 14 June 2010 в 00:53
поделиться

2 ответа

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

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

20
ответ дан 4 December 2019 в 07:47
поделиться

На точке

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

В C # это указывается с помощью RegexOptions.Singleline . Вы также можете встроить это как (? S) в узор.

Ссылки


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

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

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

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

Конечно, \ также является escape-символом для строковых литералов C #. Чтобы получить литерал \ , вам нужно удвоить его в строковом литерале (т.е. "\\" - это строка длины, равной единице). В качестве альтернативы, C # также имеет так называемые строковые литералы в кавычках @ , в которых 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 )

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

Ссылки

8
ответ дан 4 December 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: