为了帮助盲文学习者,我想过滤一个单词列表,只找到那些包含字母'd'和'n'的单词。我正在使用BBEdit 10.5.13中的正则表达式引擎。我有一个文件列表,每行一个字。
这是一个匹配每一行的正则表达式,这当然不是我想要的。
\w*?(d)?(n)?(?(1)\w*?n|(?(2)\w*?d))\w*
我想象的逻辑是:
\w*? Match all the letters before the first 'd' or 'n', if there are any
(d)? If there is a 'd' before the first 'n', capture it
(n)? If there is an 'n' before the first 'd', capture it
(?(1) If a 'd' was captured...
\w*?n ... then match all characters up to the first 'n'
|(?(2) Else if an 'n' was captured...
\w*?d ... then match all characters up to the first 'd'
))\w* Continue the match until the end of the word
显然,我的逻辑和我的正则表达式的逻辑是不同的,因为它匹配每个单词,无论它是否包含'd'或'n'。任何纠正我的逻辑的帮助将不胜感激。
这是列表中的简短摘录,包含所需的2个匹配:“秃顶”和“乐队”。
bald
balding
bale
baling
balk
balked
balking
balm
bam
ban
band
bane
答案 0 :(得分:1)
一个简单的方法:
\w*[Dd]\w*[Nn]\w*|\w*[Nn]\w*[Dd]\w*
由于最左边的匹配规则,这个简单的正则表达式应该适用于任何风格。它应该突出整个词。
如果文字中包含_
和数字,请将所有\w
更改为[a-zA-Z]
。
答案 1 :(得分:1)
这与您正在寻找的内容完全匹配。
^([a-nA-N]*[Dd][a-nA-N]*[Nn][a-nA-N]*|[a-nA-N]*[Nn][a-nA-N]*[Dd][a-nA-N]*)$
#Or for lowercase just:
^([a-n]*[Dd][a-n]*[Nn][a-n]*|[a-n]*[Nn][a-n]*[Dd][a-n]*)$