我遇到以下正则表达式的问题:
/^\s*(/?\*{1,2}(\s*(\b.*\b)\s*(\*/)?)?|\*/?\s*)$/g
我想知道我是否可以改善这个表达方式?另外,如果有人能找到这个表达式的问题,你能不能注意到它。这是我的实时demo。它适用于我在下面设置的所有条件
/**
/*
*
*/
/** Javadoc */
/* Block */
* Multi-line
/* Single Line */
/** A
/** A */
/* A
/* A */
7 * 8
// Regular comment
将匹配替换为:// $3
我成功转换了它们,尽管它们中有一些具有尾随空格:
//
//
//
// Javadoc
// Block
// Multi-line
// Single Line
// A
// A
// A
// A
/
^ Line start
\s* 0 or more white-space
( Start group 1
/? forward-slash (OPTIONAL)
\*{1,2} 1 to 2 asterisks
( Start group 2
\s* 0 or more white-space
( Start group 3
\b Start word boundry
.* 0 or more of anything
\b End word boundry
) End group 3
\s* 0 or more white-space
( Start group 4 (OPTIONAL)
\* 0 or more asterisks
/ Forward-slash
)? End group 4
)? End group 2 (OPTIONAL)
| OR
\* Asterisk
/? Forward-slash (OPTIONAL)
\s* 0 or more white-space
) End group 1
$ Line end
/
g Global; match all
答案 0 :(得分:0)
当您必须考虑字符串嵌入,转义和行继续时,解析C / C ++样式注释会稍微复杂一些。
这还需要单个字符消费pass-thru方法(在检查完所有其他方法之后)。在这种情况下,在许多可能的匹配变更中,只有一个你感兴趣的项目--C风格的评论/* */
。
因此,在全局搜索和大量匹配的情况下,只有一个会让您感兴趣,比如说捕获组1匹配。当然,在您的情况下,简单的替换不会削减它。
所以,你必须坐在全局查找(但不是替换)循环中。每个匹配都是源字符串的一部分,不会跳过任何部分,因此每个匹配都将附加到目标字符串。
在循环期间,当捕获组1匹配(C样式注释)时,您可以执行不那么简单的替换以使其成为C ++注释,然后将该结果附加到目标字符串。
这就是它的主旨。如果用你使用的任何语言都无法做到这一点,那么就无法做到这一点,这是肯定的!
以下是当您捕获C样式注释时执行转换为//
的正则表达式列表,它们必须按照外观的顺序执行(例如,符号仅为Perl):
# s{ ^ /\* (?: [^\S\n] | \*)* }{// }xmg;
# s{ ^ (?: [^\S\n] | \*)* \*/ $ }{// }xmg;
# s{ ^ $ }{// }xmg;
# s{ ^ (?: [^\S\n] | \*)+ }{// }xmg;
# s{ (?<![\s*]) (?: [^\S\n] | \*)+ $ }{}xmg;
# s{ (?<![\s*]) (?: [^\S\n] | \*)* \*/ $ }{}xmg;
这是在你的find循环中使用的正则表达式(如上所述)。这个正则表达式可以在任何Perl新闻组中找到,它是FAQ的一部分。
# (?:(/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)|//(?:[^\\]|\\\n?)*?\n)|(?:"(?:\\[\S\s]|[^"\\])*"|'(?:\\[\S\s]|[^'\\])*'|[\S\s][^/"'\\]*)
# -----------------------------------------------------------------
(?: # Comments
( # (1 start)
/\* # Start /* .. */ comment
[^*]* \*+
(?: [^/*] [^*]* \*+ )*
/ # End /* .. */ comment
) # (1 end)
|
// # Start // comment
(?: [^\\] | \\ \n? )*? # Possible line-continuation
\n # End // comment
)
|
(?: # Non - comments
"
(?: \\ [\S\s] | [^"\\] )* # Double quoted text
"
| '
(?: \\ [\S\s] | [^'\\] )* # Single quoted text
'
| [\S\s] # Any other char
[^/"'\\]* # Chars which doesn't start a comment, string, escape,
# or line continuation (escape + newline)
)