【问题标题】:match for a character if previously the other character is found如果之前找到另一个字符,则匹配一个字符
【发布时间】:2016-02-29 01:50:41
【问题描述】:

我想在一个正则表达式中匹配 c 风格的 cmets。例如

int i /* ABC 123 */
int i // ABC 123

我能写的是

(.*?)(?:/\\*|//)\\s*(ABC)\\s*(\\d)+\\s*

仅匹配

int i /* ABC 123 
or
int i // ABC 123

有没有办法在正则表达式中告诉我是否在我的字符串中有 /* 那么 */ 应该在那里,如果它以 // 我不应该匹配 */

如果可能,那么它的正则表达式是什么。

/* / 在 C 中用作多行注释,但在我的情况下,它可能不是多行注释。正如我在示例中给出的那样 -> int i / ABC 123 */ 只是一行。

int i /* ABC 123 */ 和 int i // ABC 123 在 C 语言中都是相同的。因此,如果我一个接一个地遇到它们,我不想编写一个匹配两个正则表达式中的行的正则表达式。

【问题讨论】:

  • 你是说你也想做多行搜索吗?
  • 这是解析器的任务,而不是正则表达式。
  • 您似乎忘记将\*\/ 放在正则表达式的尾部以匹配整个评论字符串。
  • 不,我没有忘记。如果我将 \*/ 放在正则表达式的尾部,那么使用该正则表达式我无法匹配行 int i // ABC 123,因为我的正则表达式期望 / 在末尾。如果我将 */ 设为可选,则它匹配我不想要的 int i / ABC 123 之类的行。因此,如果我的行在 */ 之前的某处有一个字符 /*,我想要一个带有条件的 \*/。
  • 我认为可能有一些简单的解决方案,我不知道使用单个正则表达式。于是问道。如果这很困难,那么我会像你提到的那样将它分开。谢谢。

标签: java regex pattern-matching


【解决方案1】:

你的问题有点不清楚,但我会假设:

  1. 您正在匹配多行
  2. 您正在逐行匹配

如果不是,那么您可能会修改此答案以使其正常工作。


我认为最简单的方法是设置一个布尔变量isInMultiLineComment。如果您发现一个开头评论 (/*) 没有结尾评论 (*/),那么这将是正确的,并且应该忽略其他类型的评论 (//)。

你可以用变量isInSingleLineComment做类似的事情。

【讨论】:

  • 我已经编辑了我的问题。我不想匹配多行注释,而是将单行与多行注释语法匹配。希望现在很清楚。
【解决方案2】:

试试

String regex = "//(.*)|/\\*(.*?)\\*/";
Matcher matcher = Pattern.compile(regex).matcher(yourString);
while (matcher.find()) {
   // print/add to list whatever you want
   // matcher.group(1) refers to the content of comment //
   // matcher.group(2) refers to the content of comment /* */
}

解释

//       Simply matches //
   (.*)  Group 1 matching anything
|         OR
/        Matches / from /*
\\*      Matches * from /*
(.*?)    Group 2 matching anything till the first
\\*      * is found
/        Match a /

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 2021-07-11
    • 2013-08-16
    • 1970-01-01
    • 2013-05-16
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多