【问题标题】:RegExp pattern to capture around two-characters delimiter用于捕获两个字符分隔符的正则表达式模式
【发布时间】:2011-03-24 17:55:18
【问题描述】:

我有一个字符串,类似于:

prefix::key0==value0::key1==value1::key2==value2::key3==value3::key4==value4::

我想检索与键关联的值(例如,key1)。以下模式:

::key1==([^:]*)

...仅当值中没有“:”字符时才有效,因此我想确保模式匹配仅针对子字符串:: 停止,但我找不到如何做到这一点,因为我看到的大多数示例都是关于单字符匹配的。

如何修改正则表达式模式以匹配“::key1==”和下一个“::”之间的所有字符?

谢谢!

【问题讨论】:

  • 不确定您使用的是什么语言,但例如 w/php,有什么理由不能只使用 '::' 作为分隔符来explode() 吗?

标签: regex


【解决方案1】:

你能做这样的事情吗:::key1==(.*?)::?假设语言支持惰性 ? 运算符,这应该可以工作。

【讨论】:

  • 如果支持?,这应该确实有效。您可以随时使用regexpal.com 来测试正则表达式匹配功能。
【解决方案2】:

正如我在对您的问题的评论中提到的,如果您的整个字符串是

prefix::key0==value0::key1==value1::key2==value2::key3==value3::key4==value4::

我建议在 :: 处分解/拆分字符串,而不是使用正则表达式,因为它通常总是更快。您没有指定语言,但这是一个 php 示例:

// string
$string = "prefix::key0==value0::key1==value1::key2==value2::key3==value3::key4==value4::";
// explode using :: as delimiter
$string = explode('::',$string);
// for each element...
foreach ($string as $value) {
  // check if it has == in it 
  if (strpos($value,'==')!==false) $matches[] = $value;
}
// output
echo "<pre>";print_r($matches);

输出:

Array
(
    [0] => key0==value0
    [1] => key1==value1
    [2] => key2==value2
    [3] => key3==value3
    [4] => key4==value4
)

但是,如果您坚持使用正则表达式方法,则此处为负前瞻替代方案

::((?:(?!::).)+)

php 示例

// string
$string = "prefix::key0==value0::key1==value1::key2==value2::key3==value3::key4==value4::";
preg_match_all('~::((?:(?!::).)+)~',$string,$matches);
//output
echo "<pre>";print_r($matches);

输出

Array
    (
        [0] => key0==value0
        [1] => key1==value1
        [2] => key2==value2
        [3] => key3==value3
        [4] => key4==value4
    )

【讨论】:

    【解决方案3】:

    我认为您正在寻找积极的前瞻性:

    ::key0==(.*?)(?=::\w+==)
    

    以下内容:

    prefix::key0==val::ue0::key1==value1::key2==value2::key3==value3::key4==value4::
    

    它正确地找到了 val::ue0。这也假设密钥符合 \w ([0-9A-Za-z_])

    此外,积极的前瞻可能有点矫枉过正,但如果答案也包含::,则将起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 2019-10-12
      • 2017-01-18
      • 2019-05-07
      • 2017-02-10
      • 2017-08-02
      • 1970-01-01
      相关资源
      最近更新 更多