2016-05-22 5 views
0

bashスクリプトを使用して、指定された文字列を決定する必要があります。Linux Bash Script Regexの不具合

条件は以下のとおりです。

  • 文字列の最初の3文字がハイフンの間
  • 任意の任意の配置で子音の数、一つだけ「e」は、それがどんなが含まれていないことができ、「LE-」でなければなりません母音。

    #!/bin/bash 
    # Testing regex 
    
    while read -r line; do 
         if [[ $line =~ ^le((-[^aeiou\W]*e+[^aeiou\W]*)+)$ ]] 
         then 
          printf "\""$line"\"\t\t\t-> True\n"; 
         else 
          printf "\""$line"\"\t\t\t-> False\n"; 
         fi 
    done < <(cat "[email protected]") 
    

    それは一つのことを除いて、すべてが正常ん:それは本当言う ハイフンの間

  • は、文字列は、私はこのスクリプトを作っ

ハイフンで終わってはいけません、何か

  • がなければなりませんどんなに多くのハイフンが隣にあっても。たとえば : それは、この文字列のために真の言う「ル - ル」

    私はウェブサイト上でこの正規表現式を試してみました(thisのような)と、彼らはこの誤動作なく働きました。 私は、WebページとLinux bashの間に何か違いがなければならないと考えることができます。 (私はウェブページ上でPHPを実行していることがわかります)

    どうすればいいですか?

    ありがとうございました!

  • 答えて

    0

    sweaver2112は当然\Wはあなたの問題を引き起こしますが、の作業例を提供するために失敗していることを指摘非ダッシュでなければなりませんあなたが尋ねることを行うbashテスト正規表現(少なくとも、私はそれを動作させることができませんでした)。

    これはそれを行うように見える(Laurelの子音正規表現を適応):

    [[ "$line" =~ ^le(-[b-df-hj-np-tv-z]*e[b-df-hj-np-tv-z]*)+$ ]] 
    

    それが一致した(例えば、):

    le-e 
    le-e-le 
    le-e-e-e-e-e 
    

    より一般的には:

    le-([[:consonant:]]*e[[:consonant:]]*)+ 
    

    と一致していません(例):

    le- 
    le--le 
    le-lea-le 
    

    また、あなたはもっときれいにそれを書くことができますこの方法:

    c='[b-df-hj-np-tv-z]' 
    [[ "$line" =~ ^le(-$c*e$c*)+$ ]] 
    
    +1

    あなたの答えをありがとう:-) – Janiaje

    +0

    この正規表現は2つのEがダッシュの中に入ることを防ぐことはできません: 'le-eseseeeeeeeeess-se-se'はpcregrepを使い、先読みを使うことができます。 – sweaver2112

    +0

    あなたは正しいです!私はeが母音であることを忘れていた。 'b-h 'を' b-df-h'に変更することで修正されました。 – webb

    0

    あなたの正規表現に少なくとも1つの問題があります:[^aeiou\W] - 否定の "非単語"は "単語"を意味し、matches any letterの子音が含まれています。文字クラスは包括的で排他的ではありません。すべての子音をリストするだけのほうがよかったです(あなたの場合は、「e」と「 - 」をセットに追加します)。

    のでthis oneを試してみてください(編集:ローレルのより簡潔な文字クラス@使用)に二重ダッシュが

  • (?!.*-[^-]*e[^-]*e[^-]*-)が行う許可されていない 'LE-'
  • (?!.*--)

    `(?=^le-)(?!.*--)(?!.*-[^-]*e[^-]*e[^-]*-)[b-hj-np-tv-z-]*[^-]$` 
    
    • (?=^le-)開始ダッシュの間に2つのeが表示されない
    • [b-hj-np-tv-z-]* - ([bcdfghjklmnpqrstlvwze-]と同じ)子音、E、およびダッシュを消費
    • [^-]$最後の文字が
  • +0

    charクラスを短縮することができます: '[a-hj-np-tvwz-]'。あなたに2つの理由がある理由は何ですか? – Laurel

    +0

    全く理由はありません:)(これもあなたのcharクラスを追加しました) – sweaver2112

    +0

    これは正規表現の1つの問題です... 'bash:!。* - :イベントが見つかりません ' – webb