double _ 없이 식별자와 일치하는 정규식

double _ 없이 식별자와 일치하는 정규식

_문자, 숫자로 구성되고 이중 밑줄 없이 식별자와 일치하는 정규 표현식을 원합니다 . 내 현재 시도:

^(?!_)(?!.*?_$)[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

관련 정보