Я не могу понять, что соответствует этому regex:

A: "\\/\\/c\\/(\\d*)"

B: "\\/\\/(\\d*)"

Я предполагаю, что они соответствуют какой-то числовой последовательности, поскольку \d соответствует любой цифре, но я хотел бы знать пример строки, которая соответствовала бы этому regex.

Синтаксис шаблона указан в ICU . Выражения создаются с помощью NSRegularExpression в приложении для iOS и верны.

0
Rafał Sroka 4 Мар 2014 в 01:04
Что означает «ICU»?
 – 
aliteralmind
4 Мар 2014 в 01:06
 – 
user49740
4 Мар 2014 в 01:07
Вы всегда можете изучить регулярное выражение и понять это
 – 
Gusdor
4 Мар 2014 в 01:07
Первый соответствует \/\/c\/, за которым следует (\​, а затем ноль или более экземпляров d) в виде группы. Второй такой же, за исключением того, что он соответствует \/\/ вместо \/\/c\/.
 – 
Blorgbeard
4 Мар 2014 в 01:08
Добавьте тег языка и регулярного выражения (Java, PCRE и т. д.) и объяснение того, что вы имеете в виду в ICU. Без них на ваш пост очень сложно ответить.
 – 
Ken White
4 Мар 2014 в 01:33

4 ответа

Лучший ответ

Первое соответствует //c/ + 0 или более цифр. Второй соответствует // + 0 или более цифр. В обоих фиксируются цифры.

4
John Kugelman 4 Мар 2014 в 01:07
  • Пример соответствия для A): //c/123
  • Пример соответствия для B): //12345
2
Erik Duymelinck 4 Мар 2014 в 01:11

Когда я использую Cygwin, который имитирует Bash в Windows, я иногда сталкиваюсь с ситуациями, когда мне нужно избегать escape-символов, что, по моему мнению, делает это выражение таким странным. Например, когда я использую sed для поиска одного '\', мне иногда приходится писать его как '\\\\'. (Забавно, StackOverflow подтвердил мою точку зрения. Если вы напишете 4 обратных косых черты в комментарии, он покажет только два. Так что, если вы обработаете его снова, все они могут исчезнуть в зависимости от вашей ситуации).

Учитывая это, было бы полезно думать о парах обратных косых черт как о представляющих только одну, если вы пришли из аналогичной ситуации. Я думаю, что это так. Из-за этого я бы сказал, что Эрик Дуймелинк, вероятно, на высоте. Это захватит последовательность цифр, которая может следовать или не следовать за парой косых черт и c:

// c / 000

// 00000

1
Andrew 4 Мар 2014 в 02:04

Это регулярное выражение соответствует нечетной последовательности символов, что на первый взгляд почти похоже на регулярное выражение, поскольку \d - это цифра, а за которой следует звездочка (\d*), будет означать ноль или более цифры. Но это не цифра, потому что escape-косая черта экранирована.

\\/\\/c\\/(\\d*)

Так, например, этот соответствует следующему тексту:

\/\/c\/\
\/\/c\/\d
\/\/c\/\dd
\/\/c\/\ddd
\/\/c\/\dddd
\/\/c\/\ddddd
\/\/c\/\dddddd
...    

Этот почти такой же

\\/\\/(\\d*)

За исключением того, что вы просто удалите c\/ из результатов выше:

\/\/\
\/\/\d
\/\/\dd
\/\/\ddd
\/\/\dddd
\/\/\ddddd
\/\/\dddddd
...

В обоих случаях последний \ и необязательный d - это [группа захвата] [1].

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

Pattern p = Pattern.compile("\\/\\/c\\/(\\d*)");

Это было бы недопустимо, потому что после отмены экранирования это приведет к недопустимому регулярному выражению:

\/\/c\/(\d*)

Одиночные escape-символы (\) недопустимы. Но \d действителен, так как он будет означать любую цифру.

Но опять же, я не думаю, что они недействительны, и они не экранированы для строки Java. Они просто странные.

1
miken32 19 Окт 2022 в 17:47
Я думаю, что двойной `\` на самом деле является escape-символом и обратной косой чертой, как вы использовали бы в C или C#. (У вас есть то, что я сначала прочитал буквально, пока не увидел, что совпадающий текст не имеет смысла. Я думаю, что это есть у Эрика и Джона.
 – 
Ken White
4 Мар 2014 в 01:18
Вы говорите, что это эквивалент C или C# Pattern p = Pattern.compile("\\/\\/c\\/(\\d*)");?
 – 
aliteralmind
4 Мар 2014 в 01:28
Я почти уверен, что это так. Используя дерево регулярных выражений, сгенерированное RegexBuddy, удаление одного из удвоенных \ в каждом случае делает совпадения регулярных выражений гораздо более вероятными. (Не голосование против, потому что пользователь ничего не сделал для уточнения (например, не добавил используемый язык).)
 – 
Ken White
4 Мар 2014 в 01:32
1
Так что это «неправильно», но я думаю, что это следует оставить здесь (вместе с этими корректирующими комментариями), так как другие люди, не владеющие C/C#, могут счесть это поучительным. Не голосуйте против и не заставляйте меня удалять это, слышите?! (это для всех, кроме @KenWhite :)
 – 
aliteralmind
4 Мар 2014 в 01:34
1
Ул1 = "Find '{44}' <- this literal" ; $str_regex = "\\(" + str1 + "\\)" ;
 – 
user557597
4 Мар 2014 в 03:01