java正则表达式查找子弹列表

时间:2012-04-02 15:49:58

标签: java regex

我正在尝试匹配自由文本文档中的任何项目符号列表。项目符号列表定义为以字分隔符开头的任何数字或小写字符。例如,

1.  item a
2.  item b

我使用以下代码查找项目符号:

Pattern p1 = Pattern.compile("\\s[\\d][\\.\\)]\\s");

只要子弹列表由单个数字项组成,这就可以正常工作。但是,只要我尝试多位数子弹列表,它就行不通(例如12. item c 13. item d)我试图将模式改为

Pattern p1 = Pattern.compile("\\s[\\d]+[\\.\\)]\\s");   

Pattern p1 = Pattern.compile("\\s[\\d]\\+[\\.\\)]\\s");

我对正则表达式语言的解释是,这将匹配“。”前面有1位或更多位数的任何情况。但这不起作用。

谁能看到我做错了什么?

3 个答案:

答案 0 :(得分:1)

Pattern p1 = Pattern.compile("\\s[\\d]+[\\.\\)]\\s");

(您的第二个版本)应该可以使用,但您可以简化它:

Pattern p1 = Pattern.compile("\\s\\d+[.)]\\s");

但是,它确实期望数字前面的空格(例如,它在字符串的开头不匹配)。也许word boundary在这里很有用:

Pattern p1 = Pattern.compile("\\b\\d+[.)]\\s");

(仅供参考:你的第三个例子是在一位数之后尝试匹配文字+。这就是它失败的原因。)

答案 1 :(得分:1)

更简单的正则表达式(未经测试):

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

答案 2 :(得分:0)

我认为问题在于数字前面并不总是有空格。因此,将表达式更改为(Java字符串版本)"\\s*\\d+[\\.\\)]\\s"

示例:

10. aaa //no whitespace before 10 here, thus the leading whitespace has to be optional
11. bbb //here the whitespace should match the new line which counts as whitespace

小写字符版本:

"\\s*(?:\\d+|[a-z]+)[\\.\\)]\\s"

其中(?:\\d+|[a-z]+)表示“一个数字或小写字符序列。

请注意,即使只匹配123a.部分,这仍然会匹配a.。要仅允许一行中的项目符号点,请在表达式的开头添加"(?:^|\\n)"(再次使用Java字符串),这意味着匹配必须从文本的开头或换行符开始。