在中间用管道匹配单词

时间:2017-03-16 04:33:52

标签: .net regex

我开始尝试学习正则表达式,我想尝试找出一个正则表达式,找到一个确切的单词匹配,中间有一个管道字符。例如:

我希望它能找到:

[[banana|banana]]

我希望用以下内容替换它:

[[banana]]

如果有可能,有办法找到引号或类似的东西或“-s”或“-ing”?例如:

查找

EX 1: [[banana|"banana"]]
EX 2: [[apple|apples]]
EX 3: [[do|doing]]

替换为:

EX 1: [[banana]]
EX 2: [[apple]]s
EX 3: [[do]]ing

问题是,我该怎么做?任何帮助,将不胜感激。非常感谢你!

2 个答案:

答案 0 :(得分:1)

您需要使用反向引用(\1)来匹配已经找到的子表达式:

\[\[([^]|]+)\|\"?\1(\w*)\"?\]\]

演示:https://regex101.com/r/e7LsGC/2

注意:双引号之前的反斜杠不是必需的,但如果没有这些SO语法,荧光笔将被使用

<强>更新

不确定维基百科使用什么风格,但由于评论中提到了.NET,here是一个.NET演示。正则表达式相同但替换字符串更改为[[$1]]$2

更新2

如果可选的单词结尾可能包含任何字符而不仅仅是字母数字,则表达式为

\[\[([^]|]+)\|("?)\1([^]]*)\2\]\]

Demo

请注意,在这种情况下,第二个匹配组在正则表达式内部使用,因此替换字符串应更改为[[$1]]$3

答案 1 :(得分:0)

你可以试试这个:

\[\[([^|]+)\|"?\1([^\]\["]*)"?\]\]

并替换为:

\[\[\1\]\]\2 or \[\[$1\]\]$2(根据您的软件或语言使用美元或斜线)

Demo

原因发布此解决方案的背后是:

\ w *仅涵盖a-zA-Z0-9_所以即使文本不包含&amp; *&amp;#$之类的内容,它仍可能因单引号而失败,例如:

[[确实|没有按&#39; T]]

所以要覆盖上面的例子,你需要这个解决方案