常规信息模式

时间:2012-01-25 20:00:37

标签: java regex

我正处于正则表达式学习的前几天。我正在尝试进行简单的模式匹配,以便在我的日志文件中找到@@@ XXX @@@ markers的出现,其中XXX是一个大写单词,不允许使用空格/数值(也允许使用下划线)。在开始和&&&之间没有或有多个空格。和实际的单词或单词和终止&&& XXX始终为大写,并且不允许使用空格/数值(允许使用下划线)。

一些允许的例子: @@@ CAT @@@

@@@ CAT @@@

@@@ CAT @@@

@@@ CAT_DOG @@@

我尝试过这样的事情:

Pattern pattern = Pattern.compile("\\@{3}(\\s* \\w \\s*)\\@{3}");

是不是意味着要检查3个@实例后跟o到n个空格实例,后跟一个单词后面再跟o到n个空格实例后跟3个@实例? 它使用@@捕获案例,但不捕获使用超过3 @的位置。 如何指定3个且只有3个@实例? ......显然我还没有插入大写限制。

3 个答案:

答案 0 :(得分:1)

试试这个:

(?:[^@]|^)@{3}(\s*[A-Z_]+\s*)@{3}(?!@)

// or with Java escaping

(?:[^@]|^)@{3}(\\s*[A-Z_]+\\s*)@{3}(?!@)

放置文字空间会占用一个空间。因此a bab不同。在原始模式中,\\s+ \w之间有一个空格。同样\w匹配小写和大写相似。使用字符类只会使大写匹配。


如果你想避免超过三个(正如其中一条评论所示)你必须添加一些额外的代码。

一开始我们把它说成是非@字符匹配,或者是字符串^的开头。 (?:)表示我们不关心比赛的这一部分。

(?:[^@]|^)

最后我们要说下面的字符不能是@。如果模式匹配,则(?!)表示失败。它不会最终捕获它,因为这是一个零宽度前瞻。

(?!@)

我更新了顶部的模式。

这些新模式将匹配这些。

  

@@@ CAT_DOG @@@@

     

@@@@ CAT_DOG @@@

答案 1 :(得分:1)

这是你应该做的。

[^@]?@{3}\s*([A-Z_]*)\s*@{3}[^@]
  1. [^ @]?可选地匹配@以外的任何单个字符(以排除匹配@@@@

  2. @{3}正好匹配3 @个字符

  3. \s*匹配ZERO或更多空格字符

  4. [A-Z _] *匹配ZERO或MORE大写字母或_个字符)。  包含表达式capture the contents in a Group()所以你  可以extract the contents easily

  5. \s*匹配ZERO或更多空格字符

  6. @{3}正好匹配3 @个字符

  7. [^ @]匹配@以外的任何单个字符(以排除匹配@@@@

  8. 这是interactive regular expressions pagewith your example worked out),我一直用它来处理这样的事情。

答案 2 :(得分:0)

试试这个:

"(^|[^@])@{3}\s*[_A-Z]+\s*@{3}($|[^@])"