5

有没有一种简单的方法可以将引用的文本解析为 java 的字符串?我有这样的行来解析:

author="Tolkien, J.R.R." title="The Lord of the Rings"
publisher="George Allen & Unwin" year=1954 

而我想要的只是托尔金,JRR,指环王,乔治艾伦和安温,1954 年的弦乐。

4

3 回答 3

5

您可以使用正则表达式

"(.+)"

它将匹配引号之间的任何字符。在 Java 中是:

Pattern p = Pattern.compile("\\"(.+)\\"";
Matcher m = p.matcher("author=\"Tolkien, J.R.R.\"");
while(matcher.find()){
  System.out.println(m.group(1));      
}

注意使用了group(1),这是第二个匹配,第一个,group(0),是带引号的完整字符串

当然,您也可以使用子字符串来选择除第一个和最后一个字符之外的所有内容:

String quoted = "author=\"Tolkien, J.R.R.\"";
String unquoted;    
if(quoted.indexOf("\"") == 0 && quoted.lastIndexOf("\"")==quoted.length()-1){
    unquoted = quoted.substring(1, quoted.lenght()-1);
}else{
  unquoted = quoted;
}
于 2011-08-27T03:18:07.907 回答
3

有一些花哨的模式正则表达式废话,花哨的人和花哨的程序员喜欢使用。

我喜欢使用 String.split()。这是一个简单的功能,可以做你需要做的事情。

所以如果我有一个字符串word: "hello"并且我想取出“你好”,我可以简单地这样做:

myStr = string.split("\"")[1];

这将根据引号将字符串切割成位。

如果我想更具体,我可以

myStr = string.split("word: \"")[1].split("\"")[0];

这样我就用word: "和切割它"

当然,如果word: "重复两次,你就会遇到问题,这就是模式的用途。我认为您不必针对您的特定问题处理该问题。

另外,对像 . 和 。Split 使用正则表达式,因此这些字符会触发有趣的行为。我认为"\\"=\会逃避那些有趣的规则。如果我错了,有人纠正我。

祝你好运!

于 2011-08-27T03:09:31.087 回答
1

您能假设您的文档格式正确且不包含语法错误吗?如果是这样,您只是对使用 String.split() 后的所有其他标记感兴趣。

如果您需要更健壮的东西,您可能需要使用Scanner 类(或 StringBuffer 和 for 循环;-))来挑选有效标记,同时考虑“我在某处看到引号”之外的其他标准。

例如,由于某些原因,您可能需要一个比在引号上盲目地拆分字符串更强大的解决方案:如果开始它的引号紧跟在等号之后,那么它可能只是一个有效的标记。或者也许您确实需要处理未引用的值以及引用的值?将\"需要作为转义引号处理,或者算作字符串的结尾。它可以有单引号或双引号(例如:html)还是总是用双引号正确格式化?

一种健壮的方法是像编译器一样思考并使用基于 Java 的Lexer(例如 JFlex),但这对于您的需要可能是多余的。

如果您更喜欢低级方法,您可以使用 while 循环逐个字符地遍历输入流,当您看到="开始将字符复制到 StringBuffer 直到找到另一个 non-escaped"时,或者连接到各种想要的解析值或将它们添加到某种列表中(取决于您计划对数据执行的操作)。然后继续阅读,直到再次遇到您的开始标记(例如=":),然后重复。

于 2011-08-27T04:48:00.563 回答