正则表达式在括号中匹配单词前面的表达式

时间:2013-04-16 10:39:42

标签: regex lookbehind

是否可以使用正则表达式lookbehind表达式匹配所有前面括号中的任何字词,匹配单词 consectetur libero 这个例子?

Lorem ipsum dolor sit amet,consectetur [adipiscing] elit。 Nunc eu tellus vel nunc pretium lacinia。 Proin sed lorem。 Cras sed ipsum。 Nunc a libero [quis] risus sollicitudin imperdiet。

我想从条目内容中分隔MS Word中的字典条目。条目之后是方括号中的语音转录,一旦选择它们,我就会增加它们的字体,从而将它们与文本的其余部分区分开来,并从内容中分隔出来。

编辑:Kent提供的表达式与单字条目完美匹配,例如:

沸腾['boilin] adj 1. vreo,uzavreo,kipući2。razjaren,uzrujan

带有连字符的双字条目,例如:

沸点['boilin point]svrelište

但是短语动词的第一个单词和其他两个单词的条目被省略了,这意味着在以下条目中:

bolt out ['bault'aut]vtisključiti; izlanuti

匹配 out 而不是 bolt out ,因为我需要它。

因为这是一个字典而且我可以分别为每个字母范围应用正则表达式,所以如果我有一个正则表达式来搜索以特定字母开头的第一个单词,我将能够解决这个问题括号,匹配该单词和后面的单词。对于我的例子中的“B”条目,这意味着表达式将匹配以字母B开头的单个单词,带有连字符的双字条目作为沸点并匹配“ bolt “在短语动词中,例如” bolt out “以及跟随它的介词,即在这种情况下为”out“。

在我的词典中可能只有少数(如果有的话)双字条目,这些条目中的单词以相同的字母开头,我真的可以忍受这么小的错误。

EDIT2 :我在方括号前加上分段符号,现在我在上一行的末尾有我的条目,如下所示:

[aidwulf] s zool vrsta hijene(Proteles cristata)Aron的胡子

[earanzrod] s bot divizma(Ver-bascum Thapsus)Abacca

[a'baid'on] vi bitinopomoći,stajati uz bok遵守

Aaron的胡须是以方括号开头的第二行的条目, Abacca 是以方括号开头的第三行的条目,依此类推。

为了解决我的问题,我需要两个正则表达式。首先,我需要一个正则表达式来匹配以Aa开头的单词中的每个字母Aa,并且只匹配每行中最后一个单词之前的单词。在我的示例中,第一个示例中的 A A ,第三个示例中的 a a 。然后我用星号替换这封信来获得 * ron的胡子 *等待

第二个正则表达式将匹配每行中的每个最后一个单词(包括带连字符的双字复合词)和以我之前创建的星号开头的单词。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

你需要向前看,而不是向后看:

\w+(?=\s*\[[^]])

用grep测试:

kent$  echo "Lorem ipsum dolor sit amet, consectetur [adipiscing] elit. Nunc eu tellus vel nunc pretium lacinia. Proin sed lorem. Cras sed ipsum. Nunc a libero [quis] risus sollicitudin imperdiet."|grep -Po '\w+(?=\s*\[[^\]])'
consectetur
libero

修改

试试这个正则表达式:

[bB].+?(?=\s*\[[^]])

仍然使用grep进行测试:

kent$  cat file
boiling ['boilin] adj 1. vreo, uzavreo, kipući 2. razjaren, uzrujan
with hyphenated two-word entries such as:
boiling-point ['boilin point] s vrelište
but the first word of phrasal verbs and other two-word entries is left out, which means that in the entries such as:
bolt out ['bault'aut] vt isključiti; izlanuti

kent$  grep -oP '[bB].+?(?=\s*\[[^]])' file
boiling
boiling-point
bolt out