2016-08-11 11 views
5

単語[a-zA-Z]+を1つの制約で抽出しようとしています。単語には、少なくとも1つの小文字と少なくとも1つの大文字が含まれていなければなりません言葉)。例:入力がhello 123 worLDの場合、唯一の一致はworLDです。少なくとも1つの小文字と少なくとも1つの大文字を一致させる

は、私はこのような肯定先読みを使用しようとしました:

echo "hello 123 worLD" | grep -oP "(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+" 
hello 

これは正しくありません:唯一の試合はhelloの代わりworLDです。そして、私はこれを試してみました:

echo "hello 123 worLD" | grep -oP "\K((?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+)" 
hello 
worLD 

これはまだ間違っています:helloが一致すべきではありません。

答えて

4

lookaheadsの.*は、隣接する単語だけでなく、文字列の後ろにも文字の存在を確認します。 [a-zA-Z]*使用します

echo "hello 123 worLD" | grep -oP "\\b(?=[A-Za-z]*[a-z])(?=[A-Za-z]*[A-Z])[a-zA-Z]+" 

は先読みチェックが唯一のワード境界の後に行われたように、私も先頭で単語境界\bを追加demo online

を参照してください。

1

回答:

echo "hello 123 worLD" | grep -oP "\b(?=[A-Z]+[a-z]|[a-z]+[A-Z])[a-zA-Z]*" 

デモ:https://ideone.com/HjLH5o

説明:

最初のチェックワードがその逆続い1つの小文字または副続く一つ以上の大文字で始まる場合任意の数の小文字と大文字を任意の順序で使用します。

パフォーマンス:

This solutionaccepted solutionは、47個のステップを取る一方で、提供されるテスト文字列に一致に到達するために31個の手順を実行します。

関連する問題