多行的正则表达式

时间:2012-01-18 19:03:28

标签: java regex

我正在寻找多行的模式

我是regex的新手并且在我的项目中大量使用它们

我需要提出一个匹配几组线的模式。模式应该

匹配这些行

* Source: Test                     *


*                                  *

Ord. 429 Tckt. 1

Guest:

是的,目前尚不清楚。我得到了第二行的模式(Ord.429 Tckt.1),这是:

[\s]+[\w]+[\.][\s]+[\d]+[\s]+[\w]+[\.][\s]+[\d]+

3 个答案:

答案 0 :(得分:1)

如果您需要一个大的正则表达式来匹配所有这些,如果您设置了Pattern.DOTALLPattern.MULTILINE标志,则以下内容应该有效(请参阅Rubular):

^\*[^\n]*\*$.*?^\*[^\n]*\*$|^\w+\.[ \t]+\d+[ \t]+\w+\.[ \t]+\d+$|^Guest:[^\n]*$

以下是不同部分的细分(由|分隔):

你的第一组话题:

^\*[^\n]*\*$.*?^\*[^\n]*\*$
---------------------------
^             # start of a line
\*            # a literal '*'
[^\n]*        # any number of non-newline characters    
\*            # a literal '*'
$             # end of a line
.*?           # any number of characters, as few as possible (includes newlines)
^\*[^\n]*\*$  # repeat of the first six elements of pattern as described above

第二行部分(对于像'Ord.429 Tckt.1'这样的行)是根据你的改编而改编的。

^\w+\.[ \t]+\d+[ \t]+\w+\.[ \t]+\d+$

至于第三个,它应该是非常基本的,开始一行后跟'Guest:'然后是任意数量的非换行符。

^Guest:[^\n]*$

答案 1 :(得分:0)

我假设您使用的是Java。您将使用java.util.Regex。您可能正在寻找Pattern.DOTALL上的Pattern标记。这会将行终止符视为可与.匹配的字符。

Pattern.compile(“^ * \ sSource:Test \ s ** \ s *”,Patther.DOTALL);

这取决于您希望的严格程度,但上述内容将匹配第一个代码段中的第一行(包括行终止符)。

如果您需要有关API的更多帮助,或者这是错误的API,请将您的问题编辑为更清晰。

您是否尝试在一个正则表达式中匹配所有三个?它可以做到,但模式会有点难看。我也可以帮忙。

一个不错的正则表达式测试页面是:http://www.fileformat.info/tool/regex.htm。您可以在谷歌搜索regex java tester之类的内容。

最后一件事,如果我完全理解,底部的模式将无法满足您的需求。

[\ s] +匹配一个或多个空格,因此前面需要空格。此外,您不需要方括号。它们可以工作,但只需要进行更换。如果您想匹配ab,而不是两者:[ab]。但是,如果您只想匹配a,则只需将a放入您的模式中。

\ s +一个或多个空格 \ w +一个或多个单词字符(无数字或标点符号等) 。期 \ s +一些空白 \ d +一些数字 \ s +一些空白 \ w一些单词字符 。期 \ s +一些空白 \ d +一位数

所以, \s+\w+\.\s+\d+\s+\w+\.\s+\d+

Source: Test和只有星星的线之间是否应该有空行?

你最终会得到这样的结果:

(?:                          # non-capturing group
\s*\* Source: Test\s+\*      # first line of the of the first block
\s+\*\s+\*                   # second line, assuming that there is no space
                             #     between lines or an arbitrary amout of whitespace
)                            # end of first group
|                            # or....
(?:                          # second group (non capturing)
\s+\w+\.\s+\d+\s+\w+\.\s+\d+ # what we discussed before for Org/Tckt
)
|
(?:\s+Guest:)                # the last one is easy :)

您可能知道也可能不知道这一点,但我可以通过Pattern.COMMENTS标志将您在那里的评论放入您的代码中。有些人喜欢这样。我还将不同的组分解成它们自己的常量,然后在编译模式时将它们粘贴在一起。我非常喜欢。

我希望所有这些都有所帮助。

答案 2 :(得分:0)

将多行开关(?s)添加到正则表达式的前面:

(?s)[\s]+[\w]+[\.][\s]+[\d]+[\s]+[\w]+[\.][\s]+[\d]+