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”)
。确切地说,我想抓住
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
李> - “零或多”表示为
,*
表示零或一次?
- 如果你想把正则表达式写成字符串,你还需要通过在它前面添加另一个
来转义\
\
\\( - 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
---------------------