有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式,用于保留引号、单引号、连字符和在空白处拆分

我使用Java模式类将正则表达式指定为字符串

所以举个例子 我喜欢做蜘蛛侠:“彼得·帕克”

应该把蜘蛛侠和“彼得·帕克”列为单独的标记。 谢谢

try {
     BufferedReader br = new BufferedReader(new FileReader(f));
     StringBuilder sb = new StringBuilder();
     String line = br.readLine();

     while (line != null) {
        sb.append(line);
        line = br.readLine();
     }

    String everything = sb.toString();        
    List<String> result = new ArrayList<String>();
    Pattern pat = Pattern.compile("([\"'].*?[\"']|[^ ]+)");
    PatternTokenizer pt = new PatternTokenizer(new StringReader(everything),pat,0);
    while (pt.incrementToken()) {
     result.add(pt.getAttribute(CharTermAttribute.class).toString());

     }

 }
    catch (Exception e) {
    throw new RuntimeException(e);
   }

所以我猜“some word”不起作用的原因是因为每个标记本身就是一个字符串。 有什么线索吗?谢谢!


共 (2) 个答案

  1. # 1 楼答案

    如果它不必是正则表达式,并且字符串中的数据是正确的(引号顺序正确,不像" ' some data " '),那么您可以在一次迭代中这样做

    String data="I love being spider-man : \"Peter Parker\" or 'photo reporter'";
    
    List<String> tokens = new ArrayList<String>();
    StringBuilder sb=new StringBuilder();
    boolean inSingleQuote=false;
    boolean indDoubleQuote=false;
    
    for (char c:data.toCharArray()){
        if (c=='\'') inSingleQuote=!inSingleQuote;
        if (c=='"') indDoubleQuote=!indDoubleQuote;
        if (c==' ' && !inSingleQuote && !indDoubleQuote){
            tokens.add(sb.toString());
            sb.delete(0,sb.length());
        }
        else 
            sb.append(c);
    }
    tokens.add(sb.toString());
    System.out.println(tokens);
    

    输出

    [I, love, being, spider-man, :, "Peter Parker", or, 'photo reporter']
    
  2. # 2 楼答案

    检查此正则表达式是否符合您的需要:

    "([\"'].*?[\"']|(?<=[ :]|^)[a-zA-Z0-9-]+(?=[ :]|$))"
    

    我假设你没有(单/双)报价

    关于分隔符还有一个假设:我只允许空格和:用作分隔符。在"foo_bar"中不会匹配任何内容。如果要添加更多分隔符,例如;.,?,请将其添加到“向前看”和“向后看”断言中的字符类中,如下所示:

    "([\"'].*?[\"']|(?<=[ :;.,?]|^)[a-zA-Z0-9-]+(?=[ :;.,?]|$))"
    

    尚未对每个输入进行测试,但我已经对这个输入进行了测试:

    "    sdfsdf \" sdfs  sdfsdfs \"   \"sdfsdf\"  sdfsdf   sdfsd  dsfshj sdfsdf-sdf  'sdfsdfsdf  sd f '  "
    // I used replaceAll to check the captured group
    .replaceAll("([\"'].*?[\"']|(?<=[ :]|^)[a-zA-Z0-9-]+(?=[ :]|$))", "X$1Y")
    

    这对我来说很好

    如果你想要更自由的捕捉,但仍然假设引用:

    "([\"'].*?[\"']|[^ ]+)"
    

    要提取匹配项:

    Matcher m = Pattern.compile(regex).matcher(inputString);
    List<String> tokens = new ArrayList<String>();
    while (m.find()) {
        tokens.add(m.group(1));
    }