Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl正则表达式返回引用不贪婪_Regex_Perl_Regex Greedy - Fatal编程技术网

Regex Perl正则表达式返回引用不贪婪

Regex Perl正则表达式返回引用不贪婪,regex,perl,regex-greedy,Regex,Perl,Regex Greedy,这是一个工作正则表达式: /(ANSI|AAMVA) (\d{6})(\d{2})(\d{2})(\d{0,2})((?:DL)|(?:ID))+(.*?)\g{-2}+([^"]+)/ 这是一个示例字符串: "@\n\nANSI 6334290212DL00389199ZO04420478DLDAQ3572928\nDAASMITH, JOHN DOE\nDAG\nDAL4389 NE 47TH AVE\nDAIASHLAND\nDAJOR\nDAK97555 \nDARC \

这是一个工作正则表达式:

/(ANSI|AAMVA) (\d{6})(\d{2})(\d{2})(\d{0,2})((?:DL)|(?:ID))+(.*?)\g{-2}+([^"]+)/
这是一个示例字符串:

"@\n\nANSI 6334290212DL00389199ZO04420478DLDAQ3572928\nDAASMITH, JOHN DOE\nDAG\nDAL4389 NE 47TH AVE\nDAIASHLAND\nDAJOR\nDAK97555      \nDARC   \nDASD         \nDATM     \nDAU504\nDAW180\nDBA12201212\nDBB19780303\n"
我正在尝试匹配可能第二次出现在字符串中的分隔符,
DL
ID

我想匹配先前匹配的
DL
ID
中的任何一个

问题是,如果我使用
来实现这一点,它就不再贪婪,而是更喜欢0个匹配项

我被难住了,我是不是缺少了一些基本的
操作方法

编辑:问题不是提取JSON数据,而是解析msg位,使用JSON无法完成这一点。我把绳子剪到合适的地方

@hobbs的修正是有效的,因为它让我将
更改为
+
,如果没有匹配,仍然没有匹配

工作!:)


您的数据是JSON,尝试使用正则表达式模式处理它是非常错误的。有非常好的Perl模块可以将文本转换为可导航的数据结构


我无法准确理解您需要什么,因为您正在谈论
DA
ID
字符串,而
ID
在示例数据中的任何位置都不会出现。但这个简短的计划应该会有所帮助

使用严格;
使用“全部”警告;
使用特征“说”;
使用JSON“decode_JSON”;
我的$json=do{
本地$/;
;
};
my$data=decode_json$json;
说$data->{msg};
__资料__
{“姓名”:“SC”,“主机名”:“tukwila”,“pid”:11,“级别”:30,“消息”:“@\n\nANSI 6334290212DL00389199ZO04420478DLDAQ3572928\ndasmith,JOHN DOE\nDAG\nDAL4389东北第47大道\nDAIASHLAND\nDAJOR\nDAK97555\nDARC\nDASD\ndam\nDAU504\nDAW180\ndaba12201212\nDBB19780303\n”,“时间”:“2016-04-02T01:09:07.113Z”,“v”:0}”
输出
@
ANSI 6334290212DL00389199ZO04420478DLDAQ3572928
达斯密斯,约翰·多伊
达格
东北第47大道4389号
戴亚什兰
达乔
DAK97555
DARC
DASD
DATM
DAU504
道尔180
DBA1201212
DBB19780303

问题不在于
\g{-2}?
是非贪婪的,而是紧靠它之前的
(.*)
是非贪婪的,
\g{-2}?
能够匹配任何内容,这意味着它不会失败。如果它不能失败,那么它不会强制前面的组匹配超过0个字符。因此,
(.*)
将不匹配任何内容,
\g{-2}
将不匹配任何内容,
([^“]+)
将匹配所有内容

我不完全理解您试图提取的格式(除此之外,它既古老又怪异,让我想起了CIBER账单记录)但是我建议你需要更多的锚定来将正则表达式的注意力集中在正确的地方,或者你需要升级到一个合适的语法分析器,因为你说你添加了<代码> <代码>来处理定界符永远不会出现的情况,最快的创可贴修复可能是<代码>(?:\g {-2 })。|(?=”)它断言您要么找到了分隔符,要么在没有找到它的情况下找到了结束引号


尽管如此,博罗丁的观察也是正确的;最好先解码JSON,然后使用解码后的JSON结构中的字符串,而不是直接在JSON上运行正则表达式。在这种情况下,您应该查找
\z
(字符串末尾),而不是

欢迎使用下面的堆栈。你的格式很难阅读。您能否编辑您的问题,以包含您试图解决的实际问题的清晰示例?
ID
不会出现在示例数据中的任何地方。你到底想干什么?那串话大部分都无关紧要。精简它,显示您得到的输出,并显示您想要的输出。您的示例字符串看起来非常像JSON。为什么不将其解析为JSON?ID显示在不同的数据中,这就是驾驶执照(DL)或ID背面的条形码所包含的内容。有很多奇怪的状态和一系列添加有趣的边缘案例的版本。有趣的部分不是JSON。当然,这是正确的第一步,但我的理解是,真正的任务是提取数据位,例如
00389199ZO04420478
@hobbs:我很抱歉。我错过了你不是那个OP@hobbs是正确的,JSON的东西是在别处处理的,ANSI流是我问题的相关部分。“它既古老又怪异”,你必须对此进行辩护。我不知道你的背景是什么,但OP的数据是JSON。它是简单数据的一种非常有用和常见的表示形式,受JavaScript、Python、Perl、PHP、Java、C及其系列等的支持。它有自己的MIME类型
application/json
,我想它至少和XML一样流行。你去哪了?@Borodin我显然不是在说JSON。你没有对这个问题或我的回答给予足够的重视。我仔细阅读了你的意见书。虽然这在你的脑海中可能非常有意义,但你从不提及JSON,而是以“我不完全理解你试图提取的格式”开始新的一段。对我来说,这意味着你对OP的全部数据一无所知。你在“尽管,博罗丁的观察也是有效的”之后还有一个分号(这些是
),表示你不同意我的观点。删除逗号(
)并使用冒号(
),您的帖子的意思将与您的评论一致。如果先解码json,
/s
,也需要将匹配项设置为\g{-2}或空字符串,这样可以在第二个不存在的情况下添加+号:),我假设\g{-2}?希望匹配1比0,但似乎不是这样。
/(ANSI|AAMVA) (\d{6})(\d{2})(\d{2})(\d{0,2})((?:DL)|(?:ID))+(.*?)(?:\g{-2}|(?="))+([^"]+)/