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

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

 ^(?!_)(?!.*?_$)[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 
  • Разница трубопроводов grep -c с различным регулярным выражением до bc
  • Тестирование RegExp с зольной оболочкой (BusyBox)
  • как использовать переменную в фигурной скобке в awk?
  • сопоставление шаблонов sed
  • Поиск и замена двух слов командой ex
  • Любое небелое регулярное выражение
  • Есть ли утверждения о нулевой ширине в sed?
  • подстановка строки с помощью sed
  • Как использовать grep или sed для извлечения нескольких совпадений в одной строке
  • sed и удалить строку между двумя шаблонами
  • Удалите новую строку \ linefeed перед повторением регулярного выражения
  • Linux и Unix - лучшая ОС в мире.