2016-02-16 19 views
2

你好,这是我的字符串不要在正则表达式获取字符串中的描述内容

 
/* 
anything description 
*/ 

Data1 = value1; 

Other_Data = Other_Value; 

/* 
my other description 
*/ 

Anything = Any_Answer; 

/* 

this is description and must not detect 

Description_Data = Any_Value; 

*/ 

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

 
Data1 
Other_Data 
Anything 

 
value1 
Other_Value 
Any_Answer 

在数组中,但我不想要正则表达式检测任何内部(描述框)

/* */

Description_Data = Any_Value;

这是我的正则表达式

\h*(.*?)\h*[=]\h*(.*?)\h*[;]

我的问题是,正则表达式得到即使在说明书和一些按键所有的按键和值,键之前像所有的描述键之前得到的一切......我想就这样

 
Data1 
Other_Data 
Anything 

 
value1 
Other_Value 
Any_Answer 

有什么问题?

+0

键和值只包含字母数字和下划线吗? –

+1

请分享你的尝试。 –

+0

用我的正则表达式更新 – MyJustWorking

回答

2

我假设键和值只包含字母数字和下划线。

您可以跳过描述与SKIP-FAIL PCRE construct,仅匹配在一行的开头

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

的key = value对见regex demo

正则表达式匹配:

  • \/\*[^*]*\*+([^\/*][^*]*\*+)*\/(*SKIP)(*F) - 匹配一个多行注释(这个模式是用unroll-the-loop techique,是相当有效),并使得正则表达式引擎放弃匹配的文本和索引移动到这个匹配文本(从而结束时,我们忽略了描述)
  • | - 或...
  • ^\s*(\w+)\s*=\s*(\w+) - ^比赛然后我们匹配捕获到组1(密钥)一个或多个单词字符(与(\w+)),然后只匹配零个或多个空格(\s*),接着是=,同样零个或多个空格然后我们捕获到组2()一个或多个单词字符。

(?sm)是内联修饰符,您可以将它们写为'~pattern-here~sm'sDOTALL修饰符使.匹配换行符。该mMULTILINE修改使得^$比赛一线的开头和结尾,而不是整个字符串。

一种用于当键和值可以由任何字符和值尾随边界更复杂的情况下的变化是字符串的; +换行符/端:

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

参见another demo

IDEONE demo

$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 
) 

要还忽略全单行注释(从#;//行),您还可以加入^\h*(?:\/\/|[#;])[^\n]*替代SKIP-FAIL部分:

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

见尚未another regex demo。该^\h*(?:\/\/|[#;])[^\n]*行的开头匹配(与^),那么无论是//#;,然后比换行(添加\r如果你有的Mac OS行尾)等零个或多个字符。

+0

你能解释更简单吗? – MyJustWorking

+0

正则表达式会跳过所有的'/ * ... * /',只能将键和值分别抓取到组1和2中。 :) –

+0

你能告诉我我应该怎么做#和/和; (其他描述词)在一行中? – MyJustWorking