我正在尝试使用 java 正则表达式来标记任何语言源文件。我想要列表返回的是:
- 单词 (
[a-z_A-Z0-9]
) - 空格
- 任何
[()*.,+-/=&:]
作为单个字符 - 并在引号中留下引用的内容。
这是我到目前为止的代码:
Pattern pattern = Pattern.compile("[\"(\\w)\"]+|[\\s\\(\\)\\*\\+\\.,-/=&:]");
Matcher matcher = pattern.matcher(str);
List<String> matchlist = new ArrayList<String>();
while(matcher.find()) {
matchlist.add(matcher.group(0));
}
例如,
"I" am_the 2nd "best".
返回:列表,大小8
("I", ,am_the, ,2nd, ,"best", .)
这就是我想要的。但是,如果引用整个句子(句点除外):
"I am_the 2nd best".
返回:列表,大小8
("I, ,am_the, ,2nd, ,best", .)
我希望它能够返回:列表,大小 2
("I am_the 2nd best", .)
如果这是有道理的。我相信它适用于我想要的一切,除了返回字符串文字(我想保留引号)。我在实现这一目标的模式中缺少什么?
无论如何,如果有我看不到的更容易使用的模式,请帮助我。上面显示的模式是多次试验/错误的汇编。预先非常感谢您提供的任何帮助。
最佳答案
首先,您需要将单词匹配代码与字符串文字匹配代码分开。对于单词匹配,请使用:
\w+
接下来是空格。
\s+
要将字符串作为一个标记进行匹配,您需要允许更多的字符,而不仅仅是 \w
。这只允许使用字母数字字符和 _
,这意味着不允许使用空格和符号。您还需要将开始和结束引号移到方括号之外。
并且不要忘记反斜杠来转义字符。您希望允许在字符串内使用 \"
。
"(\\.|[^"])+"
最后是符号。您可以列出所有符号,也可以将任何非单词、非空格、非引号字符视为符号。我推荐后者,这样你就不会被 @
或 |
等其他符号噎住。因此对于符号:
[^\s\w"]
将各个部分放在一起,我们得到这个组合的正则表达式:
\w+|\s+|"(\\.|[^"])+"|[^\s\w"]
或者,正确转义所有内容,以便将其放入源代码中:
Pattern pattern = Pattern.compile("\\w+|\\s+|\"(\\\\.|[^\"])+\"|[^\\s\\w\"]");
关于java - 返回java正则表达式(单词、空格、特殊字符、双引号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18627719/