簡體   English   中英

在內部模式中查找父模式是否匹配並在模式之間共享字符

[英]Look inside pattern if parent pattern matches and share chars between patterns

我有一個像這樣的字符串:

票務順序:№123123123. CED-MSW-RPG-MOW-CEK PODYLOVA / ALEMR 555 423578932 19OCT11票務順序:№123123123. 346257. CSK-MOW-PRG-MOW-CWQ PODYLOVA / ALEMR 555 45837043 19OCT11

我需要收集所有CEK,MOW,PRG等代碼。 我首先嘗試了這種模式:

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

結果得到了我所有的代碼(沒關系)和用戶的前三個字符的姓:“ PODYLOVA”中的“ POD”。 如果我說“在我的代碼之后必須將連字符或自由空間字符更改為以下代碼即可:

$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. 制作更復雜的模式:首先收集包含代碼的文本(“ CED-MSW-RPG-MOW-CEK”),然后在此模式內獲取所有#([AZ] {3}#。

看來,在我看來,解決方案#1是最好的,但是它的外觀如何?

嘗試這個:

\\b([AZ]{3})\\b

高溫超導

這會給您您想要的嗎?

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

用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM