正则表达式2合1评论

时间:2014-09-11 23:58:02

标签: regex string-matching

我知道是否有人知道是否可以使用特定的正则表达式进行评论

以下是我目前的正则表达式:@"**\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*\/+**"

这个正则表达式运行正常,但这不包含以 //

开头的评论

可以将两个正则表达式放在一起吗?

像这样:

/* Exemple 1 */

/*
 * Exemple 2
 *
 */

/*

   Exemple 3

*/

// Exemple 4

另外,如果有人知道真正好的正则表达式,是否有可能找到一个尚未关闭的引用?

像这样:

" Hello! It's just\"an example " - >不正确的报价没有关闭。

" Hello! It's just\"another \"example\" " - >同样,我有一个报价关闭,另一个没有关闭。

2 个答案:

答案 0 :(得分:2)

如果你在正则表达式中使用's'标志将其解释为“multiline”,那么

/\*.*?\*/|//.*$

将匹配阻止评论(/* ... */)或行评论(// ...)。

Regex101.com Example

更新: This regex101.com example显示以下评论案例:

/* block comments */
// line comments
"strings with /* block comments */ embedded."
"strings with // line comments embedded."
"strings with // comments" // with trailing comments

它确实使用了PCRE(\K运算符)的一个特殊功能来重置“字符串”示例之后的匹配,因此如果您使用的是Python,Javascript或旧PCRE版本,那么该部分可能会不行。

答案 1 :(得分:1)

您可以使用此表达式捕获单行和多行评论的 大多数 实例:

//(.*)|/\*([\s\S]*?)\*/

Demo

我们使用交替|将其分为两部分。第一部分(//(.*))将找到//,然后捕获以下内容(在大多数正则表达式.中匹配除换行符之外的所有内容,完美!)。第二部分(/\*([\s\S]*?)\*/)将找到/*,然后懒洋洋地捕获以下字符(我们使用[\s\S],它将找到所有空白所有非空白字符,因为.与换行符不匹配,后跟关闭*/

当你遇到这样的事情时,你会发现问题:

$string = 'foo//bar this is not a comment';

如果您要删除[\s\S],我们可以使用s修饰符(点匹配换行符)。现在我们需要更新单行注释以与新行不匹配,因此//(.*)可以替换为//(\V)\v代表垂直行字符,\V是该角色类的倒数。)

@//(\V*)|/\*(.*?)\*/@gs

Demo

最后注意事项:如果您不打算在评论中使用这些信息,则可以删除捕获组:

//.*|/\*[\s\S]*?\*/
//\V*|/\*.*?\*/

匹配封闭的双引号集有点棘手,但可以用这个来完成:

(?<!\\)"(?:[^"]|(?<=\\)")++"

Demo

请注意,我的演示文件有(?!\v),因此它与多行引号不匹配。在现实世界的实施中,这不是必需的。

(?<!       ?# begin negative look-behind assertion
  \\       ?# literally match \
)          ?# end assertion (we can't start with an escaped quote)
"          ?# literally match "
(?:        ?# begin non-capturing group
  [^"]     ?# match a non-" character
 |         ?# OR
  (?<=     ?# begin positive look-behind assertion
    \\     ?# literally match \
  )        ?# end assertion (an escaped quote is not the end of our match)
  "        ?# literally match "
)++        ?# end non-capturing group and possessively repeat 1+ times
"          ?# literally match "

possessive重复会阻止非捕获组回溯。必要的示例可以是be seen here


Update: I just had an light bulb go off and made this much simpler and more efficient!

(?<!\\)"(.*?)(?<!\\)"

与第一个示例中一样,我们使用(?<!\\)"来查找未转义的"。如果我们将其中两个夹在一个懒惰的匹配模式(.*?)周围,我们很高兴。我还在此处放置了一个捕获组,以便您可以使用\1引用带引号的字符串。