我正在尝试匹配自由文本文档中的任何项目符号列表。项目符号列表定义为以字分隔符开头的任何数字或小写字符。例如,
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位或更多位数的任何情况。但这不起作用。
谁能看到我做错了什么?
答案 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字符串),这意味着匹配必须从文本的开头或换行符开始。