使用正则表达式在java中提取值

时间:2014-12-10 16:34:27

标签: java regex

在文本文件中我有章节和诗歌,我需要提取章节编号和诗句编号。 章节的格式是[“CHAPTER”] [number] 经文的格式是[数字] [文字] 我有一个正则表达式,现在一旦搜索到一个单词就打印出文档中的章节号,就好像该单词包含在该章节中一样,但是对于这节经文,它打印出整个经文,现在只是数字。我需要这节经文的编号而不是文字。

String patt = "((?<chapter>CHAPTER\\s\\d{1,3}) (?<verse>\\d{1,3})(?<verseText>.*))|(^(?<verse2>\\d{1,3})(?<verseText2>.*))";

我如何扩展它以使其搜索经文的编号而不是文本,在文本文档中每行列出经文,并且每行的开头都有编号的编号。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

你可以这样做:

(?'Chapter'\w* ){1,3}(?'chapter_number'\d{1,3}) (?'Verse'\w*){1} (?'verse_number'\d){1,3}

你可能不必担心在章节和诗节上进行一般性匹配,因为听起来你知道它们总是相同的单词因此你可以简化以上内容:

(?'chapter'CHAPTER \d{1,3}) (?'Verse'\d{1,3})

标签为您提供了一种在数字之间进行判断的方法,并且范围允许您明确指出数字匹配的位数。

<强>更新

如果您需要它来匹配第11章(某些文本)或2(某些文本)方案,您也可以这样做:

((?'chapter'CHAPTER \d{1,3}) (?'verse'\d{1,3})(?'verse_text2'.*))|(^(?'verse2'\d{1,3})(?'verse_text'.*))

您可以尝试这些here。我发现该网站有时会进行健全性检查。

由于您正在使用Java,this site可能对您更有帮助。

java中的组命名存在一些语法差异。 This stack overflow answer非常适合调用使用和一些限制。

上次编辑以显示更符合Java的示例。在RexexPlanet site上尝试。

((?<chapter>CHAPTER \d{1,3}) (?<verse>\d{1,3})(?<verseText>.*))|(^(?<verse2>\d{1,3})(?<verseText2>.*))

我使用以下内容进行测试输入。

The Book About Old Moldy Cheese    

CHAPTER 1 1 The chease is old and moldy.
2 No it isn't
3 Yes it is
4 No it isn't
5 I said, yes it is.  
Yes it is. Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.   Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is.  Yes it is. 
6  Lame story

我希望这会有所帮助。