我开始尝试学习正则表达式,我想尝试找出一个正则表达式,找到一个确切的单词匹配,中间有一个管道字符。例如:
我希望它能找到:
[[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
问题是,我该怎么做?任何帮助,将不胜感激。非常感谢你!
答案 0 :(得分:1)
您需要使用反向引用(\1
)来匹配已经找到的子表达式:
\[\[([^]|]+)\|\"?\1(\w*)\"?\]\]
演示:https://regex101.com/r/e7LsGC/2
注意:双引号之前的反斜杠不是必需的,但如果没有这些SO语法,荧光笔将被使用
<强>更新强>
不确定维基百科使用什么风格,但由于评论中提到了.NET,here是一个.NET演示。正则表达式相同但替换字符串更改为[[$1]]$2
更新2
如果可选的单词结尾可能包含任何字符而不仅仅是字母数字,则表达式为
\[\[([^]|]+)\|("?)\1([^]]*)\2\]\]
请注意,在这种情况下,第二个匹配组在正则表达式内部使用,因此替换字符串应更改为[[$1]]$3
。
答案 1 :(得分:0)
你可以试试这个:
\[\[([^|]+)\|"?\1([^\]\["]*)"?\]\]
并替换为:
\[\[\1\]\]\2 or \[\[$1\]\]$2
(根据您的软件或语言使用美元或斜线)
原因发布此解决方案的背后是:
\ w *仅涵盖a-zA-Z0-9_所以即使文本不包含&amp; *&amp;#$之类的内容,它仍可能因单引号而失败,例如:
[[确实|没有按&#39; T]]
所以要覆盖上面的例子,你需要这个解决方案