java - 正则表达式 - 包含多个下划线的单词

标签 java regex identifier lexer

我正在制作 Lexer,并选择使用 Regex 来拆分我的标记。

我正在研究所有不同的标记,除了真正让我烦恼的是单词和标识符

你看,我制定的规则如下:

  • 单词不能以下划线开头或结尾。
  • 单词的长度可以是一个或多个字符。
  • 下划线只能在字母之间使用,并且可以出现多次。

我想要的例子:

_foo         <- Invalid.
foo_         <- Invalid.
_foo_        <- Invalid.
foo_foo      <- Valid.
foo_foo_foo  <- Valid.
foo_foo_     <- Partially Valid. Only "foo_foo" should be picked up.
_foo_foo     <- Partially Valid. Only "foo_foo" should be picked up.

我越来越接近了,因为这是我目前拥有的:

([a-zA-Z]+_[a-zA-Z]+|[a-zA-Z]+)

除此之外,它只检测第一次出现的下划线。我想要所有这些。

个人请求:

我宁愿将答案包含在一个组中,因为我围绕它们构建了标记器,但如果您能想到更好的处理方式,我会非常乐意更改我的设计。这是我目前使用的:

private void tokenise(String regex, String[] data) {
    Set<String> tokens = new LinkedHashSet<String>();
    Pattern pattern = Pattern.compile(regex);
    // First pass. Uses regular expressions to split data and catalog token types.
    for (String line : data) {
        Matcher matcher = pattern.matcher(line);
        while (matcher.find()) {
            for (int i = 1; i < matcher.groupCount() + 1; i++) {
                if (matcher.group(i) != null) {
                    switch(i) {
                    case (1):
                        // Example group.
                        // Normally I would structure like:
                        // 0: Identifiers
                        // 1: Strings
                        // 2-?: So on so forth.
                        tokens.add("FOO:" + matcher.group());
                        break;
                    }
                }
            }
        }
    }
}

最佳答案

试试 ([a-zA-Z]+(?:_[a-zA-Z]+)*)

模式的第一部分,[a-zA-Z]+,匹配一个或多个字母。
模式的第二部分 (?:_[a-zA-Z]+) 匹配一个下划线,如果它后跟一个或多个字母。
末尾的*表示第二部分可以重复零次或多次。
(?: ) 类似于普通的 (),但不返回匹配的组。

关于java - 正则表达式 - 包含多个下划线的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35169848/

相关文章:

java - 检查输入是否完成

java - 如何使用 Proguard 缩小 scala swing 库?

java - 如何测试struts 2.0.x应用程序

java - 检查文件的 MD5

Python不覆盖文件

javascript - 为什么我在 Gitlab CI 中出现 TypeError,但在运行 jest 时在我的机器上却没有?

c++ - error C2061 : syntax error : identifier, 但头文件已经包含

java - 正则表达式排除匹配的第一个和最后一个字符

c++ - Win32 API C++,未使用 WM_COMMAND 接收到标识符

.net - 标识符或变量 : Which is which?