如何在Java中获取引号之间的数据?

31

我有一些文本行,引号的数量可能会变化,例如:

Here just one "comillas"
But I also could have more "mas" values in "comillas" and that "is" the "trick"
I was thinking in a method that return "a" list of "words" that "are" between "comillas"

如何获取引号内的数据?

期望结果:

comillas
mas, comillas, trick
a, words, are, comillas

6个回答

63
你可以使用正则表达式来提取这种信息。
Pattern p = Pattern.compile("\"([^\"]*)\"");
Matcher m = p.matcher(line);
while (m.find()) {
  System.out.println(m.group(1));
}

这个示例假设被解析的行所使用的语言不支持用转义序列来表示字符串字面量中的双引号,不包含跨越多行的字符串,并且不支持其他的字符串分隔符,如单引号。


抱歉,我自己漏了一个双引号! - erickson
你能解释一下 ([^\"]*) 是什么意思吗? - user1071840
4
括号 ( ) 使这个表达式成为一个“捕获”组:匹配到的内容可以在之后被引用。方括号 [ ] 定义了一个字符集合:里面的任意一个字符都会被匹配,但是 ^ 符号表示否定这个字符集合:除了列出来的字符以外,其他字符都会被匹配。\" 是一个双引号,因为双引号是Java字符串字面量的分隔符,所以需要进行转义。星号 * 表示零个或多个前导模式中的字符,且具有贪婪性。因此,所有这些元素放在一起,([^\"]*) 的意思是:“匹配除了双引号之外的任意字符,零个或多个,记住它们作为一个组。” - erickson

20

请查看Apache commons-lang库中的StringUtils - 它包含一个substringsBetween方法。

String lineOfText = "if(getip(document.referrer)==\"www.eg.com\" || getip(document.referrer)==\"192.57.42.11\"";

String[] valuesInQuotes = StringUtils.substringsBetween(lineOfText , "\"", "\"");

assertThat(valuesInQuotes[0], is("www.eg.com"));
assertThat(valuesInQuotes[1], is("192.57.42.11"));

比正则表达式更简单易读 - RikuPotato

2
String line = "if(getip(document.referrer)==\"www.eg.com\" || getip(document.referrer)==\"192.57.42.11\"";
StringTokenizer stk = new StringTokenizer(line, "\"");
stk.nextToken();
String egStr = stk.nextToken();
stk.nextToken();
String ipStr = stk.nextToken();

1
我已经尝试了你的解决方案,并使用了Apache Commons中的StrTokenizer,它可以工作,但问题在于可能不止两对引号,可能只有一对,或者更多。 - atomsfat
完美而简单! - Eugene Maysyuk

1
如果你想从文件中获取所有匹配项
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class testReadQuotes {


    public static void main(String args[]) throws IOException{

        Pattern patt = Pattern.compile("\"([^\"]*)\"");
        BufferedReader r = new BufferedReader(new FileReader("src\\files\\myFile.txt"));

        String line;

        while ((line = r.readLine()) != null) {

          Matcher m = patt.matcher(line);

          while (m.find()) {
            System.out.println(m.group(0));
          }

        }

    }

}

1
首先,请注意你应该使用equals()而不是==。在默认情况下,"=="会询问它们是否是内存中相同的实例,在字符串中有时可能是这种情况。使用myString.equals("..."),您正在比较字符串的值。
至于如何获取引号之间的值,我不确定您的意思。"..."是一个实际的对象。或者,您可以这样做:
String webUrl = "www.eg.com";

2
我不确定他正在解析的文本行是否是Java源代码。它可能是另一个脚本,他试图从Java程序中读取以提取一些信息。 - erickson
我猜测这段文本是 JavaScript 源代码。 - Tom Hawtin - tackline

1
如果您要解析整个源文件而不仅仅是一行,那么基于函数语法的解析器可能比基于字符串更安全可靠。
我猜这些在您的语法中将是字符串字面量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接