如果父模式匹配,查看模式内部,并在模式之间共享字符


Look inside pattern if parent pattern matches and share chars between patterns

我有一个这样的字符串:

门票订单:№123123123。ceed - msw - rpg - mow - cek podylova/alemr 555423578932 19OCT11票订单:123123123。346257.CSK-MOW-PRG-MOW-CWQ PODYLOVA/ALEMR 555 45837043 19OCT11

我需要收集所有的代码是CEK, MOW, PRG等。我先试了这个模式:

$pattern = '#[-|'s]([A-Z]{3})#';

结果得到我所有的代码(那是好的)和用户姓氏的前3个字符:"POD"从"PODYLOVA"。如果我说"在我的代码后必须是连字符或自由空格字符改变我的模式为:

$pattern = '#[-|'s]([A-Z]{3})[-|'s]#';

我的$matches var有这个:

array (
  0 => 
  array (
    0 => ' CED-',
    1 => '-RPG-',
    2 => '-CEK ',
    3 => ' CSK-',
    4 => '-PRG-',
    5 => '-CWQ ',
  ),
  1 => 
  array (
    0 => 'CED',
    1 => 'RPG',
    2 => 'CEK',
    3 => 'CSK',
    4 => 'PRG',
    5 => 'CWQ',
  ),
)

你可以看到,我的模式没有"共享"所需代码之间的连字符。

我看到两个解决方案,但不能想象的模式,这将适合:

  1. 使模式在代码
  2. 之间共享连字符
  3. 制作更复杂的模式:首先收集包含代码的文本("CED-MSW-RPG-MOW-CEK"),然后获取该模式内的所有#([A-Z]{3}#。

似乎,解决方案#1是最好的,在我的情况下,但它应该是什么样子?

试试这个:

'b([A-Z]{3})'b

HTH

这是你想要的吗?

(?<=-|'s)[A-Z]{3}(?=-|'s)

test with grep:

kent$  echo "Tickets order: № 123123123. CED-MSW-RPG-MOW-CEK PODYLOVA/ALEMR 555 423578932 19OCT11 Tickets order: № 123123123. 346257. CSK-MOW-PRG-MOW-CWQ PODYLOVA/ALEMR 555 45837043 19OCT11"|grep -Po '(?<=-|'s)[A-Z]{3}(?=-|'s)' 
CED
MSW
RPG
MOW
CEK
CSK
MOW
PRG
MOW
CWQ