【问题标题】:escaping pipe ("|") in a regex在正则表达式中转义管道(“|”)
【发布时间】:2012-10-08 02:19:08
【问题描述】:

我需要拆分单词和结束标记(某些类型的标点符号)。奇怪的管道(“|”)可以算作结束标记。在我尝试添加管道之前,我已经在结束标记上编写了该单词的代码。添加管道使strsplit 每个字符。逃避它会导致错误。如何在正则表达式中包含管道?

x <- "I like the dog|."

strsplit(x, "[[:space:]]|(?=[.!?*-])", perl=TRUE)
#[[1]]
#[1] "I"    "like" "the"  "dog|" "."   

strsplit(x, "[[:space:]]|(?=[.!?*-\|])", perl=TRUE)
#Error: '\|' is an unrecognized escape in character string starting "[[:space:]]|(?=[.!?*-\|"

我想要的结果:

#[[1]]
#[1] "I"    "like" "the"  "dog"  "|"  "."  #pipe is an element

【问题讨论】:

  • 我总是犹豫是否在 R 正则表达式问题上添加正则表达式标签,因为您会得到其他语言的正则表达式,尽管答案相似,但它们不会重叠。

标签: regex r


【解决方案1】:

问题实际上是你的连字符,应该是first or last

strsplit(x, "[[:space:]]|(?=[|.!?*-])", perl=TRUE)
strsplit(x, "[[:space:]]|(?=[.|!?*-])", perl=TRUE)
strsplit(x, "[[:space:]]|(?=[.!|?*-])", perl=TRUE)
strsplit(x, "[[:space:]]|(?=[-|.!?*])", perl=TRUE)

等等都应该给你你正在寻找的输出。

如果您愿意,也可以转义连字符,但请记住使用两个反斜杠!

strsplit(x, "[[:space:]]|(?=[.!?*\\-|])", perl=TRUE)

【讨论】:

  • 两个很好的答案,乔希给出了更多的细节。感谢您的回答 +1
【解决方案2】:

解决此问题的一种方法是使用\Q...\E 表示法删除... 中任何字符的特殊含义。正如?regex 所说:

如果你想从一个序列中删除特殊含义 字符,你可以把它们放在‘\Q’和‘\E’之间。这 与 Perl 的不同之处在于“$”和“@”在 PCRE 中的“\Q...\E”序列,而在 Perl 中,“$”和“@”导致 变量插值。

例如:

> strsplit(x, "[[:space:]]|(?=[\\Q.!?*-|\\E])", perl=TRUE)
[[1]]
[1] "I"    "like" "the"  "dog"  "|"    "."

【讨论】:

  • 有趣。我肯定需要更多地阅读正则表达式。 +1
  • @Joshua,mrdwab 给出了一个很好的答案,这更加彻底。我什至从未听说过\\Q ... \\E 的事情。非常有用的信息。
  • @TylerRinker:我也从未听说过,直到我在看到您的问题后阅读了文档。 ;-)
  • @Joshua,您将发表这样的声明而不提供链接:P
  • @TylerRinker:正如我在回答中所说,它位于?regex,请参阅类似Perl 的正则表达式部分。
猜你喜欢
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
相关资源
最近更新 更多