标识符(字母、数字和下划线)的 Java 正则表达式

Tim*_*ner 2 java regex string

假设您提供了一个可能如下所示的输入(identifier1 identifier_2 23 4)

我想#在每个标识符后添加一个符号,它可以包含字母、数字和下划线。它们只能以字母开头,后跟字母、数字和下划线的变体。我的方法是这样的:

input.replaceAll("[A-Za-z0-9_]+", "$0#");
Run Code Online (Sandbox Code Playgroud)

但是,这也会#在我想排除的每个数字之后放置符号。结果应该是(identifier1# identifier_2# 23 4)。用正则表达式可以解决这个问题吗?

Wik*_*żew 5

更新 2

增量的Java说:

  • 每个标识符必须至少有一个字符。
  • 第一个字符必须选自:字母、下划线或美元符号。第一个字符不能是数字。
  • 其余字符(除了第一个)可以来自:字母、数字、下划线或美元符号。换句话说,它可以是任何有效的标识符字符。

    简而言之,标识符是从字母、数字、下划线或美元符号中选择的一个或多个字符。唯一的限制是第一个字符不能是数字。

所以,你最好使用

String pattern = "(?:\\b[_a-zA-Z]|\\B\\$)[_$a-zA-Z0-9]*+";
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示

更新

累积 使用正则表达式表示标识符,标识符正则表达式是[_a-zA-Z][_a-zA-Z0-9]*

所以,你可以使用

String pattern = "\\b[_a-zA-Z][_a-zA-Z0-9]*\\b";
Run Code Online (Sandbox Code Playgroud)

请注意,它允许_______.

您可以使用

String p = "\\b_*[a-zA-Z][_a-zA-Z0-9]*\\b";
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况。请参阅IDEONE 演示

String s = "(identifier1 identifier_2 23 4) ____ 33"; 
String p = "\\b_*[a-zA-Z][_a-zA-Z0-9]*\\b";
System.out.println(s.replaceAll(p, "$0#"));
Run Code Online (Sandbox Code Playgroud)

输出: (identifier1# identifier_2# 23 4) ____ 33

旧答案

您可以使用以下模式:

String p = "\\b(?!\\d+\\b)[A-Za-z0-9]+(?:_[A-Za-z0-9]+)*\\b";
Run Code Online (Sandbox Code Playgroud)

或者(如果 a_可以出现在最后):

String p = "\\b(?!\\d+\\b)[A-Za-z0-9]+(?:_[A-Za-z0-9]*)*\\b";
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示

该模式要求全词(如表达被包围字边界\b)不应当等于数字(检查用(?!\d+\b)),以及展开的部分[A-Za-z0-9]+(?:_[A-Za-z0-9])*被随后的零个或更多个序列的非下划线词字符的块匹配下划线后跟非下划线单词字符块。

IDEONE 演示

String s = "(identifier1 identifier_2 23 4) ____ 33"; 
String p = "\\b(?!\\d+\\b)[A-Za-z0-9]+(?:_[A-Za-z0-9]*)*\\b";
System.out.println(s.replaceAll(p, "$0#")); 
Run Code Online (Sandbox Code Playgroud)

输出: (identifier1# identifier_2# 23 4) ____ 33