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__23456v__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

私は最初の文字になることができないことを2つの異なる方法で表現しましたが、_ここではその間に何も言及されていません。__

否定的な予測を使用すると、「1つ以上の英数字または_、orで始まらず、_数字で終わらず、どこにも_許可されていません」を簡単に表現できます。__

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

負の予測なしに(awkやawkなどgrep -E)部分を分割できます。

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

文字で始まり、0個以上の英数字があり、下線を使用できますが、各下線の後には1つ以上の英数字が続く必要があります。

答え2

これを行う方法があります。

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

出力:

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

正規表現は、/(_)*.*\1/2つ以上の下線付きのすべての行を一致させます_。一致しない行を印刷するには、条件を無効にするだけです。

答え3

2つの連続した下線を含まない行を探しますか?私が欠けていない場合は、次のように動作します。

    grep -v '__'

または、複数の連続した下線を含む行を削除します。

    grep -v '__*'

または、隣接する複数の下線を含む行を削除し、1つの下線のみを含む行を維持します。

    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

関連情報