Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中类似Lisp的字符串匹配_Java_Regex_String - Fatal编程技术网

Java中类似Lisp的字符串匹配

Java中类似Lisp的字符串匹配,java,regex,string,Java,Regex,String,我在匹配这种格式的字符串时遇到一些问题:(foo“bar”)。确切地说,我想抓住 一个左括号,后跟 零个或多个空格字符,f.b 至少一个单词字符,f.b 还是空白,零或更多,f.b 一个或多个单词字符,用双引号括起来,f.b 可选空白和右括号 接下来我想提取foo和bar,但这是一个不同的问题。我想出的最好的办法是\([\s]?[\w]+[\s]?\“[\w]+\”[\s]?\),我一直在使用一个来检查我的正则表达式 您能指出我的正则表达式有什么问题吗?您的正则表达式中有额外的空格字符,导致模式

我在匹配这种格式的字符串时遇到一些问题:
(foo“bar”)
。确切地说,我想抓住

  • 一个左括号,后跟
  • 零个或多个空格字符,f.b
  • 至少一个单词字符,f.b
  • 还是空白,零或更多,f.b
  • 一个或多个单词字符,用双引号括起来,f.b
  • 可选空白和右括号
  • 接下来我想提取
    foo
    bar
    ,但这是一个不同的问题。我想出的最好的办法是
    \([\s]?[\w]+[\s]?\“[\w]+\”[\s]?\)
    ,我一直在使用一个来检查我的正则表达式


    您能指出我的正则表达式有什么问题吗?

    您的正则表达式中有额外的空格字符,导致模式不匹配。也不需要方括号。问号表示零次或一次出现,但不表示更多。要标记零或更多,应使用
    *
    。下面将使用括号中的两个匹配组匹配字符串和两个组
    foo
    bar

    Pattern pattern = Pattern.compile("\\(\\s*(\\w+)\\s*\"(\\w*)\"\\s*\\)");
    Matcher matcher = pattern.matcher("(foo \"bar\")");
    if(matcher.find()) {
        System.out.println(matcher.group(1));    // foo
        System.out.println(matcher.group(2));    // bar
    }
    
    • 您不需要像
      \w
      \s
      那样用
      [
      ]
      括起来,
      [\s]
      \s
      相同(您应该用
      [
      ]
      括/code>括起来的唯一情况是当您想要创建单独的字符类,该类组合了像
      [\s\d]这样的现有字符类时)
      ,表示空格或数字字符)
    • 默认情况下,正则表达式中包含空格,因此
      “\s”
      将匹配两个空格,一个用于
      \s
      ,另一个用于
    • “零或多”表示为
      *
      表示零或一次
    • 如果你想把正则表达式写成字符串,你还需要通过在它前面添加另一个
      \
      来转义
      \
    因此,请尝试使用下面的正则表达式“\\(\\s*\\w+\\s*\”[\\w]+\“\\s*\\)”,它表示

    \\(         - 1. An opening parenthesis
       \\s*     - 2. Zero or more whitespace chars
       \\w+     - 3. At least one word character
       \\s*     - 4. Whitespace again, zero or more
       \"       - 5. opening quotation
       \\w+     - 5. One or more char - I am not sure which symbols you want to add here
                     but you can for instance add them manually with [\\w+\\-*/=<>()]+
       \"       - 5. closing quotation
       \\s*     - 6. Optional whitespace
    \\)         - 6. closing parenthesis
    
    输出:

    entire match =  ab cd
    second word =   cd
    ---------------------
    entire match =  efg hi
    second word =   hi
    ---------------------
    

    “我的正则表达式错了”好吧,应该由你来描述你的正则表达式的问题。然后,我们可以尝试找到问题的原因和解决方案。@Pshemo问题是正则表达式与给定的规范不匹配(步骤1-6);你也可以看看第一句中的例子。原因是我还没有弄明白正则表达式;解决方案是请求SO上的指针;)“包括符号”是什么意思?您想接受哪些符号的内引号?@Pshemo这是因为我对regex缺乏经验:我想要所有字符,包括双引号
    ”之类的非单词符号,这需要转义,这是另一天的问题。我将编辑此问题以简化问题。
    entire match =  ab cd
    second word =   cd
    ---------------------
    entire match =  efg hi
    second word =   hi
    ---------------------