Java - 正则表达式 - 匹配字符串以星号或分号开头&星号

时间:2016-02-25 19:40:42

标签: java regex

需要匹配以下两种情况。

    1. 每个星号都带有星号或星号之前没有任何内容。
    1. 如果该行未以星号开头,请在"; *"
    2. 之后匹配所有内容

E.g。

*
* this is a comment
*
  * this is a comment too
A = B*C;*comment starts from here, but not before C.

(第1-4行,应该捕获C之后的第5行)

更新了我的解决方案:(^ *。 |(?< =;)\ s + *。 |(?< =;)+ *。 |( ?< =:)\ S + * |(小于=:?)+ *

使用regexplanet.com/advanced/java/index.html

进行测试

只是想知道是否有更好的解决方案。

感谢您提供帮助以实现这一目标。 问候。

2 个答案:

答案 0 :(得分:1)

此正则表达式将执行您要求的操作并在匹配中为您捕获文本:

(^ *\*.*|;\*.*)

我们使用组构造来捕获所有内容,然后使用OR(|)传入两个正则表达式。

为了打破这种局面,让我们从'('和'|':

之间的第一部分开始吧
^  = start at the beginning of a line
 * = followed by zero or more spaces (note there's a [space] hiding in there)
\* = followed by an '*'
.* = followed by zero or more of any character (all the way to end of line)

对于'|'之间表达式的第二部分和')':

;\* = look for ';*'
.*  = followed by zero or more of any character (all the way to end of line)

我注意到的一件事是你没有考虑';'之间的可能空格和'*'。如果您需要,那么我们只需要在表达式的第二部分添加“零或多个空格”部分:

(^ *\*.*|; *\*.*) // note [space] characters hiding in there.

以下是用于测试此问题的'测试文件':

*
* this is a comment
*
  * this is a comment too
A = B*C;*comment starts from here, but not before C.
A = B*C; *comment starts from here, with a space for readability.

您可以在https://www.regex101.com(或其他人根据自己的喜好)对此进行测试。

您可能需要进行其他优化,例如将\s元序列替换为硬编码[space]字符,但我尝试完全按照您的要求进行操作。

答案 1 :(得分:0)

您可以这样编程:

String line; // Assuming the string you're going through is in this line.
String comment;

if (line.trim().startsWith("* ")){ // Deals with cases where it is just the comment
    comment = line;
} else if (line.contains(";*") { // Deals with cases where the comment is in the line
    comment = line.substring(line.indexOf(";*"));
}