这两个正则表达式匹配什么?

时间:2014-03-03 21:04:16

标签: ios regex

我无法弄清楚这个regex匹配的内容:

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

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

我认为他们匹配某种数字序列,因为\d匹配任何数字,但我想知道一个与此regex匹配的字符串示例。

模式语法是ICU指定的语法。表达式是在iOS应用中使用NSRegularExpression创建的,并且是正确的。

4 个答案:

答案 0 :(得分:4)

第一个匹配//c/ + 0个或更多个数字。第二个匹配// + 0或更多数字。两个数字都被捕获。

答案 1 :(得分:2)

  • A)匹配的示例是//c/123
  • B)匹配的示例是//12345

答案 2 :(得分:2)

编辑:这个答案来自Java人。这是错误的,因为它实际上是一个C / C#问题,直到它被回答后才明白。请参阅以下评论, 不要 向下投票。在我看来,它应该保留下来。


这个正则表达式匹配一个奇怪的字符序列,乍一看,几乎看起来像一个正则表达式,因为\d是一个数字,后面跟一个星号(\d*)意味着零 - 或更多数字。但它一个数字,因为转义斜杠被转义。

\\/\\/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*)

单个转义斜杠(\)无效。但是\d是有效的,因为它意味着任何数字。

但是,我认为它们无效,并且它们 转义为Java字符串。他们只是奇怪。

非常有趣。

答案 3 :(得分:1)

当我使用在Windows上模拟Bash的Cygwin时,我有时遇到必须逃避转义字符的情况,我认为这使得这个表达看起来很奇怪。例如,当我使用sed寻找单个'\'时,我有时必须将其写为'\\\\'。 (有趣的是,StackOverflow证明了我的观点。如果你在评论中写下4个反斜杠,它只会显示两个。所以如果你再次处理它,它们可能会根据你的情况消失。)

考虑到这一点,如果您来自类似的情况,将反斜杠对视为仅代表一对可能会有所帮助。我的猜测就是你。因此,我会说Erik Duymelinck可能会被发现。这将捕获一系列数字,这些数字可能会或可能不会跟随一些斜线和c:

// C / 000

// 00000