【问题标题】:Parsing quoted text in java在java中解析引用的文本
【发布时间】:2011-11-04 22:50:15
【问题描述】:

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

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

而我想要的只是托尔金,J.R.R.,指环王,乔治·艾伦和安温,1954 年作为弦乐。

【问题讨论】:

  • 您可以尝试使用 Javascript regular expression
  • @Ryan:我的错。但是正则表达式肯定是一种方法。
  • @David 您能告诉我们哪个答案选择为最佳答案对您的帮助最大?

标签: java string parsing string-parsing


【解决方案1】:

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

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

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

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

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

如果我想更具体,我可以做

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

这样我就用word: ""剪掉了

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

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

祝你好运!

【讨论】:

  • @david :D 没问题。正则表达式也让我感到困惑。它有更多的潜力,但这对于 90% 的情况来说已经足够好了。如果您喜欢我的回答,请给它最好的标签吗?
  • split() 采用正则表达式参数,因此请注意在正则表达式中可能具有特殊含义的字符,例如“。” (点)和任何类型的括号。
  • @Philipp 这就是我回答的后半部分所讨论的内容。
  • @Ryan 哦,没看到。谢谢:)
【解决方案2】:

你可以使用像这样的正则表达式

"(.+)"

它将匹配引号之间的任何字符。在 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;
}

【讨论】:

  • 我同意正则表达式很麻烦,但是如果您经常使用字符串,那么它绝对值得研究。 perl 正则表达式文档是一个很好的起点:perldoc.perl.org/perlre.html
  • 您可以大大简化您的代码 y 捕获周围的双引号:使用lookbehind和lookahead
【解决方案3】:

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

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

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

一种可靠的方法是像编译器一样思考并使用基于 Java 的 Lexer(例如 JFlex),但这可能对您的需要来说太过分了。

如果您更喜欢低级方法,您可以使用 while 循环逐个字符地遍历输入流,当您看到 =" 时,开始将字符复制到 StringBuffer 中,直到找到另一个未转义的 @ 987654325@,要么连接到各种想要的解析值,要么将它们添加到某种列表中(取决于您打算如何处理数据)。然后继续阅读,直到再次遇到您的开始令牌(例如:="),然后重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多