我想知道是否有人知道是否可以为注释使用特定的正则表达式
这是我当前的正则表达式:@"**/*([^*]|[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
引用引用的字符串。