繁体   English   中英

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

[英]Java regex for identifiers (letters, digits and underscores)

假设您给出了一个看起来像这样的输入(identifier1 identifier_2 23 4)

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

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

但是,这也会在我想排除的每个数字后面加上#符号。 结果应该是(identifier1# identifier_2# 23 4) 是否有可能用正则表达式解决这个问题?

更新2

增量Java说:

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

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

所以,你最好用

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

正则表达式演示

更新

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

因此,您可以使用

String pattern = "\\b[_a-zA-Z][_a-zA-Z0-9]*\\b";

注意 ,它允许_______

您可以使用

String p = "\\b_*[a-zA-Z][_a-zA-Z0-9]*\\b";

为了避免这种情况。 请参阅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#"));

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

老答案

您可以使用以下模式:

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

或(如果_可以出现在末尾):

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

正则表达式演示

该模式要求整个单词(因为表达式用单词边界\\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#")); 

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

您当前的正则表达式说

一个或多个大写或小写字母,数字或下划线,顺序不限。

根据该正则表达式, 54是有效标识符。

你真的想写

字母,后跟任意数量的字母,数字或下划线,顺序不限

可以用以下代码编写:

input.replaceAll("[A-Za-z][A-Za-z0-9_]*", "$0#");

Wiktor指出,此正则表达式仍将匹配非标识符形式的内容中的“标识符”。 要解决此问题,您可以使用以下变体:

input.replaceAll("\\b([A-Za-z][A-Za-z0-9_]*)\\b", "$1#")

此拒绝123ab123作为有效的标识符,但接受ab123123 ab123

如果您想使用 java 来读取 java,java 可以为您提供: "\\b\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*\\b"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM