java - 返回java正则表达式(单词、空格、特殊字符、双引号)

标签 java regex text-parsing lexer

我正在尝试使用 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/

相关文章:

python - 解析文本文件中的文本 block (由空行分隔的 block )

c# - Reflection.Emit 的 Java 等价物

python - 正则表达式在单个匹配中查找并打印多个匹配

java - 在 Java 中解析文本文件

c# - 文本框 : insert spaces for credit card number?

c# - 正则表达式验证 .NET 的非负小数或空白?

linux - 执行sed命令时出错

java - 无法在 Java Eclipse 中创建新的 Android 应用程序

java - Android:Java 错误意外的标记(数组)

java - Spring计划任务: specifying time zone in XML configuration