[英]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*?/
演示:
正則表達式MODALIDADE:“ BRANCO”: http ://regexr.com/3d02f正常工作,但這是因為07存在,如果07不存在且存在於MODALIDADE:1中,則會得到錯誤的值。
正則表達式MODALIDADE:1: http ://regexr.com/3d02i正在獲取MODALIDADE 9的值。
正則表達式MODALIDADE 9: http ://regexr.com/3d02l正在獲取正確的值,但是它可能會獲取錯誤的值,因為其他的也是如此。
問題是*? BASE CAL PREV 13之后,便接受所有內容以找到匹配項。 我該如何解決?
謝謝。!!
如果我正確理解了您的問題,則可以:
更改.*?
到((?!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*?
要么...
由於您所有的正則表達式都非常相似,並且只有一個值(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.