亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則表達式僅過濾無空格字符串

正則表達式僅過濾無空格字符串

PHP
POPMUISE 2022-12-11 09:18:55
我目前有以下正則表達式:(?<=\[)([^\]]+)結果如下:text* your-nameemail* your-emailtext your-subjecttextarea your-messagesubmit "Submit"your-subjectyour-nameyour-emailyour-message我想調整我的正則表達式,以便它過濾掉中間有空格的結果,這樣我只剩下以下結果:your-subjectyour-nameyour-emailyour-message我怎樣才能做到這一點?目前是這樣的:https://regex101.com/r/yP3iB0/58
查看完整描述

3 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

你可以使用

(?<=\[)[^]\s]+(?=])

請參閱正則表達式PHP 演示。請注意,該$matches結構在模式中沒有捕獲組時更清晰,所有上下文都使用非消耗性環視檢查。

細節

  • (?<=\[)[- 需要立即在當前位置左側的正向后視

  • [^]\s]+ - 除了](不需要轉義它,因為它是否定字符類中的第一個字符)和空格之外的1+ 個字符

  • (?=])]- 需要緊靠當前位置右側的正向前瞻(]在字符類之外并不特殊)。

PHP 演示

$arr = ['[text* your-name]','[email* your-email]','[text your-subject]','[textarea your-message]','[submit "Verzenden"]','[your-subject]','[your-name]','[your-email]','[your-message]'];


foreach ($arr as $s) {

  if (preg_match_all('~(?<=\[)[^]\s]+(?=])~', $s, $matches)) {

    print_r($matches[0]);

  }

}

輸出:


Array

(

    [0] => your-subject

)

Array

(

    [0] => your-name

)

Array

(

    [0] => your-email

)

Array

(

    [0] => your-message

)


查看完整回答
反對 回復 2022-12-11
?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

從您當前的模式開始,您所要做的就是從字符類中排除空格或所有空白字符,并檢查后面是否有右方括號。所以(?<=\[)([^]\s]+)(?=])在整個比賽或捕獲組中的結果(這使它無用)。

但是你可以寫一個更好的模式,更簡單,更高效:\[([^]\s]+)]。演示

更簡單,因為有一個捕獲組,你不必使用環視來提取你想要的沒有括號的內容。它也更短,更容易理解。

由于兩個啟動優化,效率更高:

  • 第一個也是最重要的:當模式以文字字符串(此處為左括號)開頭時,快速算法會在字符串中搜索該文字字符串在主題字符串中出現的所有位置,并且只會在這些位置測試該模式. 否則,如果您將此括號括在后視中就是這種情況,則此啟動優化是不可能的,并且將在主題字符串中的每個位置測試該模式。

  • 第二種叫做自動占有。當最終回溯不會改變結果時,它會在編譯時自動使量詞占有所有格。比如,停留的時候a*b變成。在我們的例子中,由于字符類不包括右括號,因此變為. 具體而言,當找到空格而不是右括號時,貪婪量詞不會返回字符來嘗試其他可能性,模式失敗,正則表達式引擎會在下一個位置嘗試模式。再一次,將括號放在前瞻中會禁用此優化。a*+ba.*ba.*b[^]\s][^]\s]+][^]\s]++]

但是為什么環視會禁用這些優化呢?原因很簡單,這些優化需要研究模式,所以為了讓這些分析保持快速,它們僅限于簡單的情況。(請注意,捕獲組不會干擾自動占有。)


如果你絕對想避免捕獲組但又想保留這兩個優化,那么沒有什么可以禁止寫的:

\[\K[^]\s]++(?=]) 演示

或更有趣:

\[(?=[^]\s]++\K]) 演示

這兩個模式以文字開頭[,所有格量詞是手動添加的。


查看完整回答
反對 回復 2022-12-11
?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

/^\[\K([^ \]]+)(?=\])/gm

在https://regex101.com/r/yP3iB0/62測試這個正則表達式模式


查看完整回答
反對 回復 2022-12-11
  • 3 回答
  • 0 關注
  • 143 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號