我有一个带有一些自定义标签的文件,我想写一个正则表达式来提取标签之间的字符串.例如,如果我的标签是:
[customtag]String I want to extract[/customtag]
Run Code Online (Sandbox Code Playgroud)
如何编写正则表达式以仅提取标记之间的字符串.这段代码似乎是朝着正确方向迈出的一步:
Pattern p = Pattern.compile("[customtag](.+?)[/customtag]");
Matcher m = p.matcher("[customtag]String I want to extract[/customtag]");
Run Code Online (Sandbox Code Playgroud)
不知道下一步该怎么做.有任何想法吗?谢谢.
hoi*_*loi 162
你走在正确的轨道上.现在您只需要提取所需的组,如下所示:
final Pattern pattern = Pattern.compile("<tag>(.+?)</tag>", Pattern.DOTALL);
final Matcher matcher = pattern.matcher("<tag>String I want to extract</tag>");
matcher.find();
System.out.println(matcher.group(1)); // Prints String I want to extract
Run Code Online (Sandbox Code Playgroud)
如果要提取多个匹配,请尝试以下操作:
public static void main(String[] args) {
final String str = "<tag>apple</tag><b>hello</b><tag>orange</tag><tag>pear</tag>";
System.out.println(Arrays.toString(getTagValues(str).toArray())); // Prints [apple, orange, pear]
}
private static final Pattern TAG_REGEX = Pattern.compile("<tag>(.+?)</tag>", Pattern.DOTALL);
private static List<String> getTagValues(final String str) {
final List<String> tagValues = new ArrayList<String>();
final Matcher matcher = TAG_REGEX.matcher(str);
while (matcher.find()) {
tagValues.add(matcher.group(1));
}
return tagValues;
}
Run Code Online (Sandbox Code Playgroud)
但是,我同意正则表达式不是最好的答案.我将使用XPath来查找我感兴趣的元素.有关详细信息,请参阅Java XPath API.
jdc*_*589 10
说实话,正则表达式不是这种解析的最佳选择.你发布的正则表达式可能适用于简单的情况,但如果事情变得更复杂,你将会遇到很大的问题(同样的原因,你不能用正则表达式可靠地解析HTML).我知道你可能不想听到这个,我知道当我问同样类型的问题时我没有,但是在我停止尝试使用正则表达式之后,字符串解析变得更加可靠.
jTopas是一个非常棒的标记器,可以很容易地手动编写解析器(我强烈建议使用标准java扫描程序/等等的jtopas库).如果你想看到jtopas在运行,这里有一些我用jTopas编写的解析器来解析这种类型的文件
如果要解析XML文件,则应使用xml解析器库.不要自己做,除非你只是为了好玩,这里有很多经过验证的选择
查找标记,属性和值的通用,更简单和有点原始的方法
Pattern pattern = Pattern.compile("<(\\w+)( +.+)*>((.*))</\\1>");
System.out.println(pattern.matcher("<asd> TEST</asd>").find());
System.out.println(pattern.matcher("<asd TEST</asd>").find());
System.out.println(pattern.matcher("<asd attr='3'> TEST</asd>").find());
System.out.println(pattern.matcher("<asd> <x>TEST<x>asd>").find());
System.out.println("-------");
Matcher matcher = pattern.matcher("<as x> TEST</as>");
if (matcher.find()) {
for (int i = 0; i <= matcher.groupCount(); i++) {
System.out.println(i + ":" + matcher.group(i));
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
String s = "<B><G>Test</G></B><C>Test1</C>";
String pattern ="\\<(.+)\\>([^\\<\\>]+)\\<\\/\\1\\>";
int count = 0;
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(s);
while(m.find())
{
System.out.println(m.group(2));
count++;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
160143 次 |
| 最近记录: |