如何组合正则表达式外观表达式

时间:2016-01-25 08:38:56

标签: regex token regex-lookarounds

对于此示例文本:

  

快速的棕色狐狸跳过懒狗“是一个1 ***英语2 *** pangram - 一个包含所有字母表字母的短语。它通常用于触摸打字练习。它还用于测试打字机和计算机键盘,显示字体以及涉及3 ***英文字母4 ***中所有字母的其他应用程序。

我需要一个正则表达式才能在多个x ***标记之间进行匹配,同时剥离前导和尾随空格。如果我对正则表达式的了解有限,那么结果应该匹配到两个单独的环视组中。

  

英语语言

     

英文字母

我有两个表达式可以独立工作但不能串联工作:

(?<=1\*\*\*\s).*(?=\s2\*\*\*)
....
(?<=3\*\*\*\s).*(?=\s4\*\*\*)

我尝试过各种方法将它们组合在一个表达式中,但结果却不正确。 e.g。

(?<=1\*\*\*\s).*(?=\s2\*\*\*)\w+(?<=3\*\*\*\s).*(?=\s4\*\*\*)
  

没有比赛

我应该指出,我可以控制令牌格式,因此请根据正则表达式中的易用性推荐一个。它只需要包含一系列大多数非字母数字字符,因此它不会在数据中本地找到。我的猜测是我可能需要至少两个令牌;一个开始和一个结束。

修改 我取得了进步,但我的正则表达式引擎的行为与regex101的行为不同:

(?<=1\*\*\*\s)(.*)(?=\s2\*\*\*).*?(?<=3\*\*\*\s)(.*)(?=\s4\*\*\*)

结果:

  

英语2 *** 3 ***英语

为什么呢?如何纠正?

2 个答案:

答案 0 :(得分:1)

(?<=[1-9]\*\*\*)\s*(.*?)(?=\s*[1-9]\*\*\*)

您可以使用此功能并抓住group 1。请参阅演示。

https://regex101.com/r/cZ0sD2/9

如果你只想要2匹配使用

(?<=[13]\*\*\*)\s*(.*?)(?=\s*[24]\*\*\*)

答案 1 :(得分:1)

如果你想要一个匹配其中一个的正则表达式,你可以使用交替(|):

(?<=1\*\*\*\s).*(?=\s2\*\*\*)|(?<=3\*\*\*\s).*(?=\s4\*\*\*)

See it in action

如果你想要一个在不同组中同时匹配的正则表达式,你可以在它们之间使用.*?并将它们放在匹配的组中(()):

(?<=1\*\*\*\s)(.*)(?=\s2\*\*\*).*?(?<=3\*\*\*\s)(.*)(?=\s4\*\*\*)

See it in action