一次匹配2个模式的正则表达式或同时匹配两个模式的Applescript中的SED

问题描述

我有2种类型的字符串用户输入,并且我试图通过使用1个正则表达式进行匹配。 到目前为止,我已经使用2个正则表达式进行了此操作,但是我想将它们组合成一个匹配两个字符串的..如果可能的话。 我要寻找的比赛是:617251,617076,985922,147721

首次用户输入(字符串):

JEANS
Blue-Denim
6607020201
617076
HOSEKNLA
Oliv
6909020002
985922
ROCKWBKU
Rot
6919020006
147721
BLAZER
rot

我将这个与(?<!\d)\d{6}(?!\d)

匹配

第二个用户输入(字符串):

a Ecru  617 251 64  I   b Lagune    617 076 64
c Gelb  985 922 64  I   d Weiß  147 721 64
asdasfas

我将其与以下项匹配:(\d){3} (\d){3},但是如果不替换,则无法删除匹配结果的space

如果不可能的话,我的另一个想法是通过在AppleScript中使用SED来清除两种类型的字符串以匹配所需的结果。

解决方法

在第一个模式中使用环视功能时,您可以使用2个捕获组,其中第二个捕获组与可选空间匹配。

(?<!\d)(\d{3}) ?(\d{3})(?!\d)

部分

  • (?<!\d)向后看是负数,请不要在左侧直接声明一个数字
  • (\d{3})捕获第1组,匹配3位数字
  • <code> ?(\d{3})匹配可选空格并在 group 2
  • 中捕获3位数字
  • (?!\d)负向查找,请不要在右边直接声明一个数字

Regex demo

,

要进行匹配,您应该考虑使用grep而不是sed

这是OSX上的有效grep。请注意,将\<\>用于单词边界,因为从示例数据中可以明显看出,您实际上并不需要先行断言和先行断言。

grep -oE '\<[0-9]{3} ?[0-9]{3}\>' file

617076
985922
147721
617 251
617 076
985 922
147 721

在OSX上,等效的sed是这样:

sed -nE '/[[:<:]][0-9]{3} ?[0-9]{3}[[:>:]]/p' file