我知道是否有人知道是否可以使用特定的正则表达式进行评论
以下是我目前的正则表达式:@"**\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*\/+**"
这个正则表达式运行正常,但这不包含以 //
开头的评论可以将两个正则表达式放在一起吗?
像这样:
/* Exemple 1 */
/*
* Exemple 2
*
*/
/*
Exemple 3
*/
// Exemple 4
另外,如果有人知道真正好的正则表达式,是否有可能找到一个尚未关闭的引用?
像这样:
" Hello! It's just\"an example "
- >不正确的报价没有关闭。
" Hello! It's just\"another \"example\" "
- >同样,我有一个报价关闭,另一个没有关闭。
答案 0 :(得分:2)
如果你在正则表达式中使用's'标志将其解释为“multiline”,那么
/\*.*?\*/|//.*$
将匹配阻止评论(/* ... */
)或行评论(// ...
)。
更新: 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]*?)\*/
我们使用交替|
将其分为两部分。第一部分(//(.*)
)将找到//
,然后捕获以下内容(在大多数正则表达式.
中匹配除换行符之外的所有内容,完美!)。第二部分(/\*([\s\S]*?)\*/
)将找到/*
,然后懒洋洋地捕获以下字符(我们使用[\s\S]
,它将找到所有空白和所有非空白字符,因为.
与换行符不匹配,后跟关闭*/
。
当你遇到这样的事情时,你会发现问题:
$string = 'foo//bar this is not a comment';
如果您要删除[\s\S]
,我们可以使用s
修饰符(点匹配换行符)。现在我们需要更新单行注释以与新行不匹配,因此//(.*)
可以替换为//(\V)
(\v
代表垂直行字符,\V
是该角色类的倒数。)
@//(\V*)|/\*(.*?)\*/@gs
最后注意事项:如果您不打算在评论中使用这些信息,则可以删除捕获组:
//.*|/\*[\s\S]*?\*/
//\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 "
possessive重复会阻止非捕获组回溯。必要的示例可以是be seen here。
Update: I just had an light bulb go off and made this much simpler and more efficient!
(?<!\\)"(.*?)(?<!\\)"
与第一个示例中一样,我们使用(?<!\\)"
来查找未转义的"
。如果我们将其中两个夹在一个懒惰的匹配模式(.*?
)周围,我们很高兴。我还在此处放置了一个捕获组,以便您可以使用\1
引用带引号的字符串。