【发布时间】:2011-10-24 05:10:15
【问题描述】:
我正在尝试使用正则表达式来查找特定的起始字符,然后获取该特定行上的其余文本。
例如文本可以是...
V:中音 T:节奏
我想用正则表达式来抓取“V:”和它后面的文字。
有没有什么好的、快速的方法可以使用正则表达式来做到这一点?
【问题讨论】:
我正在尝试使用正则表达式来查找特定的起始字符,然后获取该特定行上的其余文本。
例如文本可以是...
V:中音 T:节奏
我想用正则表达式来抓取“V:”和它后面的文字。
有没有什么好的、快速的方法可以使用正则表达式来做到这一点?
【问题讨论】:
如果你的起始字符是固定的,你会创建一个像这样的模式:
Pattern vToEndOfLine = Pattern.compile("(V:[^\\n]*)")
并使用find() 而不是matches()。
如果你的起始字符是动态的,你总是可以编写一个方法来返回所需的模式:
Pattern getTailOfLinePatternFor(String start) {
return Pattern.compile("(" + start + "[^\\n]*");
}
这些可以根据您的需要进行一些工作。
【讨论】:
对于模式匹配,请尝试您的示例:
V:.*$
【讨论】:
这是最好、最干净、最简单(即单行)的方法:
String[] parts = str.split("(?<=^\\w+): ");
解释:
正则表达式在第一个单词(在本例中为“V”)之后的“:”处使用正则表达式中断并捕获两半。
这是一个测试:
String str = "V: mid-voice T: tempo";
String[] parts = str.split("(?<=^\\w+): ");
System.out.println("key = " + parts[0] + "\nvalue = " + parts[1]);
输出:
key = V
value = mid-voice T: tempo
【讨论】:
^ 锁定在行首,所以它最多只会命中一次。将测试代码复制粘贴到 main 中,然后运行它并使用一些边缘案例来亲自查看。
PatternSyntaxException: Look-behind group does not have an obvious maximum length。也就是说,这种向后看是可以的(没有错误)。此外,移除锚点以仅留下"(?<=\\w+): "仍然可以,尽管从技术上讲它是无限长的。通过测试,我得出结论,对于 java,不允许的后视使用具有常量后跟“任意长度”匹配的正则表达式:即 (?<=x[\w]*) not OK,(?<=[\w]*x) is 好的。有趣!