在 bash 中匹配日语正则表达式(简单范围)无法按预期工作

在 bash 中匹配日语正则表达式(简单范围)无法按预期工作

我很确定我的正则表达式没问题,但它们不适用于 bash。我自己制作了它们,使用https://unicode.org/charts/。正如您将看到的,它们与 awk 一起正常工作。

以下是一些范围,让您无需亲自检查,特别是如果您不懂日语:

  • 平假名 [ぁ-ゟ]

    • ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ>゙>゚__ゝゞゟ
  • 片假名 [゠-ヿㇰ-ㇿ!-○]

    • ゠ァァィィゥウェエオカガキギクグケゲコゴサザシジジズセゼソゾタソゾタソチヂッツヅテデトドナニヌネノハバパヒビピブプヘベペホボポマミムメモャヤュユョヨラリルヮワワヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ
    • ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ
    • !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghhiijklmnopqrstuvwoxyz{|}~ ⦅⦆。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑ하ᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵ¢£¬ ̄¦¥₩│←↑→↓ð○

我还有一个正则表达式来查找汉字[一-龥],但这个正则表达式在 bash 中按预期工作。
这些>>> wrong!是我添加的注释,以查明问题所在。

[[ "する" =~ [ぁ-ゟ] ]] && echo 'is hiragana' || echo 'is not hiragana'
is hiragana

echo 'する' | awk '/[ぁ-ゟ]/ {print "is hiragana"}'
is hiragana

[[ "スル" =~ [ぁ-ゟ] ]] && echo 'is hiragana' || echo 'is not hiragana'
is hiragana >>> wrong!

echo 'スル' | awk '/[ぁ-ゟ]/ {print "is hiragana"}'

[[ "僕" =~ [ぁ-ゟ] ]] && echo 'is hiragana' || echo 'is not hiragana'
is not hiragana

echo '僕' | awk '/[ぁ-ゟ]/ {print "is hiragana"}'

[[ "する" =~ [゠-ヿㇰ-ㇿ!-○] ]] && echo 'is katakana' || echo 'is not katakana'
is katakana >>> wrong!

echo 'する' | awk '/[゠-ヿㇰ-ㇿ!-○]/ {print "is katakana"}'

[[ "スル" =~ [゠-ヿㇰ-ㇿ!-○] ]] && echo 'is katakana' || echo 'is not katakana'
is katakana

echo 'スル' | awk '/[゠-ヿㇰ-ㇿ!-○]/ {print "is katakana"}'
is katakana

[[ "僕" =~ [゠-ヿㇰ-ㇿ!-○] ]] && echo 'is katakana' || echo 'is not katakana'
is not katakana

echo '僕' | awk '/[゠-ヿㇰ-ㇿ!-○]/ {print "is katakana"}'

就像 bash 认为平假名和片假名是等价的,就像它事先转换它们一样?

答案1

有你想要的脚本:

string1="する"
string2="スル"

if echo "$string1" | grep -P '[ぁ-ゟ]' >/dev/null; then
    echo 'is hiragana'
else
    echo 'is not hiragana'
fi

if echo "$string2" | grep -P '[ぁ-ゟ]' >/dev/null; then
    echo 'is hiragana'
else
    echo 'is not hiragana'
fi

if echo "$string1" | grep -P '[゠-ヿㇰ-ㇿ!-○]' >/dev/null; then
    echo 'is katakana'
else
    echo 'is not katakana'
fi

if echo "$string2" | grep -P '[゠-ヿㇰ-ㇿ!-○]' >/dev/null; then
    echo 'is katakana'
else
    echo 'is not katakana'
fi

相关内容