簡體   English   中英

如果不存在正確的正則表達式,則匹配其他組

[英]Regex matching other group if the right one doesn't exist

我需要創建3個正則表達式:

第一個值取07之后的值,在BASE CAL 13 PREV SOC之后,在FECHAMENTO-MODALIDADE:“ BRANCO”之后。

第二個取第四個值,在07之后,BASE CAL 13 PREV SOC之后和FECHAMENTO-MODALIDADE之后:1。

第三個值取07之后,BASE CAL 13 PREV SOC之后以及FECHAMENTO-MODALIDADE之后的第四個值:7。

這是我創建的正則表達式,但是它們是錯誤的:

1. /\sFECHAMENTO - EMPRESA MODALIDADE :\s"BRANCO".*?BASE CÁL 13º PREV SOC\s*?(?:(?:01|02|03|04|05|06)(?:\s[\d,.]+)+)?\s01(\s[\d,.]+){4}\s*?/

2. /\sFECHAMENTO - EMPRESA MODALIDADE :\s1.*?BASE CÁL 13º PREV SOC\s*?(?:(?:01|02|03|04|05|06)(?:\s[\d,.]+)+)?\s07(\s[\d,.]+){4}\s*?/

3. /\sFECHAMENTO - EMPRESA MODALIDADE :\s9.*?BASE CÁL 13º PREV SOC\s*?(?:(?:01|02|03|04|05|06)(?:\s[\d,.]+)+)?\s07(\s[\d,.]+){4}\s*?/

演示:

  1. 正則表達式MODALIDADE:“ BRANCO”: http ://regexr.com/3d02f正常工作,但這是因為07存在,如果07不存在且存在於MODALIDADE:1中,則會得到錯誤的值。

  2. 正則表達式MODALIDADE:1: http ://regexr.com/3d02i正在獲取MODALIDADE 9的值。

  3. 正則表達式MODALIDADE 9: http ://regexr.com/3d02l正在獲取正確的值,但是它可能會獲取錯誤的值,因為其他的也是如此。

問題是*? BASE CAL PREV 13之后,便接受所有內容以找到匹配項。 我該如何解決?

謝謝。!!

如果我正確理解了您的問題,則可以:

  1. 更改.*? ((?!FECHAMENTO).)*? 在每個正則表達式中,它將防止.*? 從重疊到另一個FECHAMENTO(...)段; 像:

     \\sFECHAMENTO - EMPRESA MODALIDADE :\\s"BRANCO"((?!FECHAMENTO).)*?(BASE CÁL) 13º PREV SOC\\s*?(?:(?:01|02|03|04|05|06)(?:\\s[\\d,.]+)+)?\\s(07)(\\s[\\d,.]+){4}\\s*? 

    演示

    要么...

  2. 由於您所有的正則表達式都非常相似,並且只有一個值(1,9,“ BRANCO”)不同,因此您可以使用一個正則表達式,並通過此一個值區分大小寫:

     \\sFECHAMENTO - EMPRESA MODALIDADE :\\s("BRANCO"|9|1)(?:(?!FECHAMENTO).)*?BASE CÁL 13º PREV SOC\\s*?(?:(?:01|02|03|04|05|06)(?:\\s[\\d,.]+)+)?\\s07(?:\\s([\\d,.]+)){4}\\s*? 

    演示

    只需檢查組$1捕獲了哪個值,您將獲得相應的值。

我認為第二種選擇更好,但這取決於您。

暫無
暫無

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

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