регулярное выражение для соответствия идентификаторам без двойного _

Я хочу, чтобы регулярное выражение соответствовало идентификаторам, состоящим из букв, цифр и _ , без двойных подчеркиваний. Моя текущая попытка:

 ^(?!_)(?!.*?_$)[a-zA-Z][a-zA-Z0-9_]+$ 

Пример:

 Abdfsdfsdf__ 1B2345_ v1__23456 __23456789b 12345-6789 123456789 1_fsdfdfsdf v_fsdfsdf_fsdfd v_123 v__123 v134234_fsdfsd 123456 a1b2c3d4e5 

Подобранная:

 v1__23456 v_fsdfsdf_fsdfd v_123 v__123 v134234_fsdfsd a1b2c3d4e5 

Как удалить строки v1__23456 и v__123 из совпадений?

4 Solutions collect form web for “регулярное выражение для соответствия идентификаторам без двойного _”

 ^(?!_) # don't start with _ (?!.*?_$) # don't end with _ [a-zA-Z] # the first character must be a letter [a-zA-Z0-9_]+$ # after that digits and underscores are ok 

Вы выразились двумя разными способами: первый символ не должен быть _ , но ничего здесь ничего не говорит о __ в середине.

Используя негативный взгляд, просто выразить «один или несколько буквенно-цифровых символов или _ , не начинать с _ или цифрой, не заканчивать на _ и не допускать __ anywhwere»:

 ^(?![0-9_]|.*__.*_$|)[0-9A-Z_a-z]+$ 

Без негативного обзора (например, в awk или grep -E ) вы можете разделить куски:

 ^[A-Za-z][0-9A-Za-z]*(_[0-9A-Za-z]+)*$ 

Начните с буквы, затем нуля или более буквенно-цифровых символов, тогда вы можете иметь подчеркивания, но за каждым должен следовать один или несколько буквенно-цифровых символов.

Есть один способ сделать это:

 perl -nle 'print if /(_)*.*\1/' pattern.txt 

Ouput:

 1B2345_ 12345-6789 123456789 1_fsdfdfsdf v_123 v134234_fsdfsd 123456 a1b2c3d4e5 

/(_)*.*\1/ выражение / ( /(_)*.*\1/ будет соответствовать всей строке, имеет два или более подчеркивания _ . Просто отрицайте условие для печати строк, которые не совпадают.

Вы хотите найти строки, которые НЕ содержат два последовательных символа подчеркивания? Если я что-то не хватает, это должно работать:

  grep -v '__' 

или для удаления строк, содержащих любое количество последовательных символов подчеркивания:

  grep -v '__*' 

или удалить строки, содержащие несколько смежных подчеркиваний, но сохранить строки, содержащие только одно подчеркивание:

  grep -v '___*' 
 $ grep -E '^(_?[A-Za-z0-9])*[A-Za-z](_?[A-Za-z0-9])*$' example.txt 1_fsdfdfsdf v_fsdfsdf_fsdfd v_123 v134234_fsdfsd a1b2c3d4e5 
  • Соответствие гексадецималов с gawk
  • эталонная проблема при использовании sed
  • Как захватить содержимое строки до определенной строки?
  • Замените все цифры номера социального страхования (SSN) на X
  • Подсчет последовательных повторений определенного символа (например,)
  • Как искать историю bash в режиме vi для «foo. * Bar»
  • Заменить символы в пользовательской части адреса электронной почты
  • Какие типы поддержки регулярных выражений поддерживают (например) отрицательный lookbehind?
  • многострочный awk регулярное выражение
  • sed: портативное решение для соответствия «любому персонажу, но новой строке»,
  • Почему perl regex находит шаблон \\ label \ {. *? \}, Но не \\ ref. *? \} Или \\ autoref \ {. *? \} В файлах TeX?
  • Linux и Unix - лучшая ОС в мире.