隐藏正则表达式元素

时间:2015-09-14 13:15:10

标签: regex regex-lookarounds

我正在尝试从键值对列表中解析出一个值。我的所有数据都很脏。键/值可以用1个或多个空格分隔,值可以包含空格。我的数据看起来像这样:

@"cat=test desc=my dog has fleas     det=3  extra=example"

这导致我走极端去解析。我几乎拥有以下内容:

@"(?<=\bdesc\b\=)[\w\s:#/%\?:\-.]*((?:(\s*).*\=)|$)"

仅限以下键(“det =”)未被隐藏。我也尝试过吗?&gt;和?&lt;无济于事。帮助

3 个答案:

答案 0 :(得分:2)

这是一种提取所有键/值对的方法。如果您只想提取一个(或多个)键/值对,则只需要更明确地更改第一个捕获组中的子模式(在这种情况下,不要忘记使用单词边界或其他内容)这可以作为):

([^\s=]+)=(\S+(?>\s+[^\s=]+)*(?!=))

demo

\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 + =))+ *

会给你“我的狗有跳蚤”。最重要的是它允许结果中的空格(不会在“我的”之后停止)。它不断拉动数据直到它达到“某事=”。此正则表达式还处理第一个和最后一个元素的情况。