不要在正则表达式的描述内容中获取字符串


Do not get string in description content in regex

你好,这是我的字符串

/*任何描述*/数据 1 = 值 1;Other_Data = Other_Value;/*我的其他描述*/任何东西 = Any_Answer;/*这是描述,不得检测Description_Data = Any_Value;*/

现在我想使用正则表达式并得到这样的东西

数据1Other_Data什么

值1Other_ValueAny_Answer

在数组中,但我不希望正则表达式检测到(描述框(/*

*/
喜欢的任何内容
Description_Data = Any_Value;

这是我的正则表达式

''h*(.*?''h*[=]''h*(.*?(''h*[;]

我的问题是正则表达式即使在描述和某些键中也能获取所有键和值,在键之前获取所有内容,就像键之前的所有描述一样......我想这样

数据1Other_Data什么

值1Other_ValueAny_Answer

问题出在哪里?

我假设键和值仅由字母数字和下划线组成。

您可以使用 SKIP-FAIL PCRE 结构跳过描述,只匹配行首的键=值对

(?m)'/'*[^*]*'*+([^'/*][^*]*'*+)*'/(*SKIP)(*F)|^'s*('w+)'s*='s*('w+)

查看正则表达式演示

正则表达式匹配:

  • '/'*[^*]*'*+([^'/*][^*]*'*+)*'/(*SKIP)(*F) - 匹配多行注释(此模式是用展开循环技术编写的,非常有效(,并使正则表达式引擎丢弃匹配的文本并将索引移动到此匹配文本的末尾(因此,我们忽略描述(
  • | - 或...
  • ^'s*('w+)'s*='s*('w+) - ^匹配一行的开头,然后我们匹配并捕获到组 1((一个或多个单词字符(带 ('w+) (,然后只匹配零个或多个空格 ( 's* ( 后跟 = ,再次是零个或多个空格符号,然后我们捕获到组 2((一个或多个单词字符。

(?sm)是内联修饰符,您可以将它们编写为 '~pattern-here~sm' .s是一个 DOTALL 修饰符,使.匹配换行符。m是一个多行修饰符,使^$匹配一行的开头和结尾,而不是整个字符串。

当键和值可以包含任何字符并且值尾随边界; +换行符/字符串末尾时,更复杂的情况的变体:

(?sm)'/'*[^*]*'*+(?:[^'/*][^*]*'*+)*'/(*SKIP)(*F)|^'s*([^='n]+?)'s*='s*(.*?);'h*(?:$|'r?'n)

观看其他演示

IDEONE演示:

$re = '~/'*[^*]*'*+(?:[^/*][^*]*'*+)*/(*SKIP)(*F)|^'s*([^='n]+?)'s*='s*(.*?);'h*(?:$|'r?'n)~sm'; 
$str = "/*'nanything description'n*/'n'nData1 = value1;'n'nOtherData<> = Other Value;'n'n/*'nmy other description'n*/'n'nAny thing = Any 'nAnswer;'n'n/*'n'nthis is description and must not detect'n'nDescription_Data = Any_Value;'n'n*/"; 
preg_match_all($re, $str, $matches);
print_r($matches[1]);
print_r($matches[2]);

输出:

Array
(
    [0] => Data1
    [1] => OtherData<>
    [2] => Any thing
)
Array
(
    [0] => value1
    [1] => Other Value
    [2] => Any 
Answer
)

要忽略完整的单行注释(以 #;// 开头的行(,您可以添加 SKIP-FAIL 部分的^'h*(?:'/'/|[#;])[^'n]*替代项:

(?sm)(?:^'h*(?:'/'/|[#;])[^'n]*|'/'*[^*]*'*+(?:[^'/*][^*]*'*+)*'/)(*SKIP)(*F)|^'s*([^='n]+?)'s*='s*(.*?);'h*(?:$|'r?'n)

查看另一个正则表达式演示。^'h*(?:'/'/|[#;])[^'n]*匹配一行的开头(带 ^ (,然后匹配 //#;,然后匹配换行符以外的零个或多个字符(如果您有 Mac OS 行尾,请添加'r(。