我正在尝试从键值对列表中解析出一个值。我的所有数据都很脏。键/值可以用1个或多个空格分隔,值可以包含空格。我的数据看起来像这样:
@"cat=test desc=my dog has fleas det=3 extra=example"
这导致我走极端去解析。我几乎拥有以下内容:
@"(?<=\bdesc\b\=)[\w\s:#/%\?:\-.]*((?:(\s*).*\=)|$)"
仅限以下键(“det =”)未被隐藏。我也尝试过吗?&gt;和?&lt;无济于事。帮助
答案 0 :(得分:2)
这是一种提取所有键/值对的方法。如果您只想提取一个(或多个)键/值对,则只需要更明确地更改第一个捕获组中的子模式(在这种情况下,不要忘记使用单词边界或其他内容)这可以作为):
([^\s=]+)=(\S+(?>\s+[^\s=]+)*(?!=))
\S+(?>\s+[^\s=]+)*(?!=)
\S+ # all that is not a whitespace
(?> # open an atomic group
\s+ # one or more whitespaces
[^\s=]+ # all non-whitespaces characters except "="
)* # repeat the atomic group zero or more times
(?!=) # check if not followed by an "="
该模式旨在减少步骤数。原子组的目标是禁止子模式\s+[^\s=]+
的回溯,因此,正则表达式引擎记录的唯一回溯位置是组的开始。当达到等号时,(?!=)
失败,只需要一个回溯步骤(返回到最后一次重复之前的位置)。
请注意,此模式会修剪值的尾随空格。
答案 1 :(得分:1)
一种可能的方法:
/([^=]+)=([^=]+?)(?=\w+=|$)/g
Regex101 Demo。关键是使用 lazy 修饰符来匹配值substring(与前一个属性名称的前瞻相结合)。如果您不想要尾随空格,请使用略有不同的version,基于相同的方法:
/(\S+)=([^=]+?)(?=\s+\w+=|$)/g
答案 2 :(得分:0)
我找到了一个非常有用的答案(值得分享)。
给出字符串@“cat = test desc = my dog has fleas det = 3 extra = example”
?&LT = \ BDESC =)(?!((\ S + \ W + =))+ *
会给你“我的狗有跳蚤”。最重要的是它允许结果中的空格(不会在“我的”之后停止)。它不断拉动数据直到它达到“某事=”。此正则表达式还处理第一个和最后一个元素的情况。