我有一个这样的字符串:
门票订单:№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',
),
)
你可以看到,我的模式没有"共享"所需代码之间的连字符。
我看到两个解决方案,但不能想象的模式,这将适合:
- 使模式在代码 之间共享连字符
- 制作更复杂的模式:首先收集包含代码的文本("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