UPDATE 2
Incremental Java говорит:
- Каждый идентификатор должен иметь хотя бы один символ.
- Первый символ должен быть выбран из: альфы, подчеркивания или знака доллара. Первый символ не может быть цифрой.
- Остальные персонажи (помимо первого) могут быть: альфа, цифра, знак подчеркивания или знак доллара. Другими словами, это может быть любой действительный символ идентификатора.
Проще говоря, идентификатор представляет собой один или несколько символов, выбранных из знака альфа, цифры, подчеркивания или доллара. Единственное ограничение - это первый символ, который не может быть цифрой.
Таким образом, вы бы лучше использовать
String pattern = "(?:\\b[_a-zA-Z]|\\B\\$)[_$a-zA-Z0-9]*+";
См the regex demo
UPDATE
АСС. до Representing identifiers using Regular Expression, регулярное выражение идентификатора - [_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 demo.
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
OLD ОТВЕТ
Вы можете использовать следующую схему:
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";
См regex demo
Схема требует, чтобы все слово (как выражение заключено с границами слова \b
) не должен быть равно числу (проверено с (?!\d+\b)
) и развернутыми частями [A-Za-z0-9]+(?:_[A-Za-z0-9])*
матчей без подчеркивания которые сопровождаются нулем или несколькими последовательностями подчеркивания, за которыми следуют несимвольные словарные фрагменты символов.
IDEONE demo:
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
Не так ли [работа, как и ожидалось] (https://regex101.com/r/bL7kJ8/1)? Вы имеете в виду, что '' 'должно появляться после' 23' и '4'? –
Я только хочу поместить символы '#' после идентификаторов, но не после цифр. Так что это должно быть (identifier1 # identifier_2 # 23 4) –
Думаю '\ b (?! \ D + \ b) [A-Za-z0-9 _] + \ b' может помочь. Но это не исключает строки, такие как '_____'. Чтобы исключить thiose, вы можете дополнительно ограничить '\ b (?! _ + \ B | \ d + \ b) [A-Za-z0-9 _] + \ b'. Или даже ['\ b (?! \ D + \ b) [A-Za-z0-9] + (?: _ [A-Za-z0-9]) * \ b'] (https: // regex101. ком/г/bL7kJ8/2). –