Regex二合一征求意见



我想知道是否有人知道是否可以为注释使用特定的正则表达式

这是我当前的正则表达式:@"**/*([^*]|[rn]|(*+([^*/]|[rn])))**/+**"

此正则表达式运行良好,但不包括以//开头的注释

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

像这样:

/* Exemple 1 */
/*
 * Exemple 2
 *
 */
/*
   Exemple 3
*/
// Exemple 4

此外,如果有人知道非常好的正则表达式,有可能找到一个没有结束的引号吗?

像这样:

" Hello! It's just"an example "->不正确-报价未结束。

" Hello! It's just"another "example" "->同样,我有一个引号已关闭,另一个没有关闭。

如果在regex风格中使用's'标志将其解释为"多行",则

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

将匹配块注释(/* ... */)或行注释(// ...)。

Regex101.com 示例

更新:此regex101.com示例显示以下注释情况:

/* 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版本,则该部分可能不起作用。

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

//(.*)|/*([sS]*?)*/

演示

我们使用交替的|将其分成两部分。第一部分(//(.*))将找到//,然后捕获以下内容(在大多数regex风格中,.匹配除换行符之外的所有内容,非常完美!)。第二部分(/*([sS]*?)*/)将找到/*,然后延迟捕获以下字符(我们使用[sS],它将找到所有空白字符所有非空白字符,因为.与换行符不匹配),然后是结束的*/

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

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

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

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

演示

最后一点:如果你不打算使用评论中的信息,你可以删除捕获组:

//.*|/*[sS]*?*/
//V*|/*.*?*/

匹配双引号的闭集有点棘手,但可以通过以下操作完成:

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

演示

请注意,我的演示有(?!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 "

所有格重复可以防止非捕获组回溯。这里可以看到一个必要的例子。


更新:我刚刚关掉了一个灯泡,让它变得更简单、更高效

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

与第一个示例一样,我们使用(?<!\)"来查找未转义的"。如果我们把其中两个夹在一个懒惰匹配的模式(.*?)周围,我们就可以开始了。我还围绕这个放了一个捕获组,这样你就可以用1引用引用的字符串。

最新更新