_
문자, 숫자로 구성되고 이중 밑줄 없이 식별자와 일치하는 정규 표현식을 원합니다 . 내 현재 시도:
^(?!_)(?!.*?_$)[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
답변1
^(?!_) # 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
첫 번째 문자가 될 수 없다는 것을 두 가지 다른 방식으로 표현했는데 _
여기서는 그 사이에 아무것도 언급되지 않았습니다.__
부정 예측을 사용하면 "하나 이상의 영숫자 문자 또는 _
, or로 시작하지 않고 _
숫자로 끝나지 않으며 어디에도 _
허용되지 않음 "을 간단히 표현할 수 있습니다.__
^(?![0-9_]|.*__.*_$|)[0-9A-Z_a-z]+$
부정적인 예측 없이( awk 또는 awk 와 같이 grep -E
) 부분을 분할할 수 있습니다.
^[A-Za-z][0-9A-Za-z]*(_[0-9A-Za-z]+)*$
문자로 시작하고 0개 이상의 영숫자가 있고 밑줄을 사용할 수 있지만 각 밑줄 뒤에는 하나 이상의 영숫자가 와야 합니다.
답변2
이를 수행하는 방법이 있습니다:
perl -nle 'print if /(_)*.*\1/' pattern.txt
산출:
1B2345_
12345-6789
123456789
1_fsdfdfsdf
v_123
v134234_fsdfsd
123456
a1b2c3d4e5
정규식은 /(_)*.*\1/
두 개 이상의 밑줄이 있는 모든 줄을 일치시킵니다 _
. 일치하지 않는 행을 인쇄하려면 조건을 무효화하기만 하면 됩니다.
답변3
두 개의 연속 밑줄이 포함되지 않은 줄을 찾으시겠습니까? 내가 빠진 것이 없다면 다음과 같이 작동합니다.
grep -v '__'
또는 연속된 밑줄이 여러 개 포함된 줄을 제거하세요.
grep -v '__*'
또는 인접한 여러 밑줄이 포함된 줄을 제거하고 밑줄이 하나만 포함된 줄은 유지합니다.
grep -v '___*'
답변4
$ 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