我試圖將我係統的宏下面的EBNF grammar編碼爲一個正則表達式(下圖),但儘管我盡了最大的努力,但看起來與多個宏匹配時很貪心:它不會在關閉}}@
處停止。爲什麼這個正則表達式貪婪,當我告訴它不是?
Expand ``@{{...}}@`` references which may appear in Step parameters.
The syntax is described by the following EBNF grammar::
depdata = "@{{", source identifier, ":", attribute, "}}@"
| "@{{TAGS:", expression, "}}@" ;
source identifier = ? printable 7-bit ASCII ? ;
attribute = "DATADIR" | "TAGSFILE" | "RESULT_INT" ;
expression = ? printable 7-bit ASCII ? ;
和Python的正則表達式我已經拿出
@{{(?:(?:(?P<id>.*?):(?P<attr>DATADIR|TAGSFILE|RESULT_INT))|TAGS:(?P<expr>.+?))}}@
編輯:加內expr
組
+
當在下面的測試情況發現所有的比賽,我希望得到的結果是3場比賽,但我只得到兩個:
@{{TAGS:sTagsJob << "job||ID||source"}}@ test @{{job:DATADIR}}@ email body @{{job:DATADIR}}@ blah
我期待的比賽是:
@{{TAGS:sTagsJob << "job||ID||source"}}@
與expr
組集@{{job:DATADIR}}@
與id
和attr
羣組設定@{{job:DATADIR}}@
(再次)與id
和attr
組設置
而是比賽是:
@{{TAGS:sTagsJob << "job||ID||source"}}@ test @{{job:DATADIR}}@
@{{job:DATADIR}}@
爲什麼非貪婪匹配(.+?
)似乎表現貪婪?我錯過了什麼?我知道EBNF語法很傻,可以通過固定字符串出現在右邊來改善它,但這不是我的問題:我想了解爲什麼我的正則表達式具有失敗我)
的'*',雖然「懶」,仍然會嘗試儘可能多的,因爲它可以返回一個有效的匹配相匹配。?。嘗試['@ {{(?:TAGS | [ - 〜] +?):(:(:DATADIR | TAGSFILE | RESULT_INT | [ - 〜] +?)}} @'](https://regex101.com/r/mJ9lX3/1) –
如果您需要保留組:['@ {{(?P TAGS | [ - 〜] +?):(?:(?P DATADIR | TAGSFILE | RESULT_INT)|(?P [ - 〜] +?))}} @'](https://regex101.com/r/mJ9lX3/3)。 –
我不得不在ASCII表上查找'[ - 〜]'來確定它是7位可打印的ASCII。太好了! – RobM