programing

페르시아 문자만 허용하는 정규식

minimums 2023. 7. 12. 23:39
반응형

페르시아 문자만 허용하는 정규식

저는 사용자 정의 검증자 중 한 명이 페르시아 문자만 허용하는 양식을 만들고 있습니다.다음 코드를 사용했습니다.

var myregex = new Regex(@"^[\u0600-\u06FF]+$");
if (myregex.IsMatch(mytextBox.Text))
{
    args.IsValid = true;
}
else
{
    args.IsValid = false;
}

하지만, 그것은 모든 페르시아 문자를 포함하지 않기 때문에 아랍 문자만 감지할 수 있는 것처럼 보입니다. (이 네 개가 부족합니다: گ, پ, ژ, چ, ▁).)

이 문제를 해결할 방법이 있습니까?

TL;DR

Farsi MUST 사용 문자 집합은 다음과 같습니다.

  • 문자에 사용하거나 정규식 맛과 관련된 코드 포인트 사용(모든 엔진이 지원하는 것은 아님)\uXXXX표기법):

    ^[\u0622\u0627\u0628\u067E\u062A-\u062C\u0686\u062D-\u0632\u0698\u0633-\u063A\u0641\u0642\u06A9\u06AF\u0644-\u0648\u06CC]+$
    
  • 숫자에 사용하거나 정규식 맛과 관련하여 사용합니다.

    ^[\u06F0-\u06F9]+$
    
  • 사용하다[ ‬ٌ ‬ًّ ‬َ ‬ِ ‬ُ ‬ْ ‬]모음의 경우 또는 정규식 맛과 관련하여:

    [\u202C\u064B\u064C\u064E-\u0652]
    

또는 그것들의 조합.당신은 Hamza와 같은 다른 아랍 문자를 추가하고 싶을지도 모릅니다.ء추가로 사용자의 캐릭터 세트에 적용됩니다.

왜 그럴까요?[\u0600-\u06FF]그리고.[آ-ی]둘 다 틀렸습니까?

비록 ~일지라도\u0600-\u06FF포함:

  • گ 포인트로06AF
  • چ 포인트로0686
  • پ 포인트로067E
  • ژ 포인트로0698

또한, 모든 대답이 시사하는 바는[\u0600-\u06FF]또는[آ-ی]입니다.

\u0600-\u06FF필요 이상으로 209개의 문자가 포함되어 있습니다! 그리고 숫자도 포함되어 있습니다!

enter image description here

자초지종

이 대답은 일반적인 오해를 해결하기 위해 존재합니다.0600를 통하여06FF페르시아어 / 파르시 문자를 표시하지 않음(둘 다 표시하지 않음)[آ-ی]):

[\u0600-\u0605 ؐ-ؚ\u061Cـ ۖ-\u06DD ۟-ۤ ۧ ۨ ۪-ۭ ً-ٕ ٟ ٖ-ٞ ٰ ، ؍ ٫ ٬ ؛ ؞ ؟ ۔ ٭ ٪ ؉ ؊ ؈ ؎ ؏
۞ ۩ ؆ ؇ ؋ ٠۰ ١۱ ٢۲ ٣۳ ٤۴ ٥۵ ٦۶ ٧۷ ٨۸ ٩۹ ءٴ۽ آ أ ٲ ٱ ؤ إ ٳ ئ ا ٵ ٮ ب ٻ پ ڀ
ة-ث ٹ ٺ ټ ٽ ٿ ج ڃ ڄ چ ڿ ڇ ح خ ځ ڂ څ د ذ ڈ-ڐ ۮ ر ز ڑ-ڙ ۯ س ش ښ-ڜ ۺ ص ض ڝ ڞ
ۻ ط ظ ڟ ع غ ڠ ۼ ف ڡ-ڦ ٯ ق ڧ ڨ ك ک-ڴ ػ ؼ ل ڵ-ڸ م۾ ن ں-ڽ ڹ ه ھ ہ-ۃ ۿ ەۀ وۥ ٶ
ۄ-ۇ ٷ ۈ-ۋ ۏ ى يۦ ٸ ی-ێ ې ۑ ؽ-ؿ ؠ ے ۓ \u061D]

255자가 아랍어 블록(0600-06) 아래에 있습니다.FF), Farsi 알파벳에는 32개의 문자가 있습니다. Farsi 문자는 Farsi 숫자 시연 외에 42개입니다.만약 우리가 Tanvin 없이 모음(원래는 Farsi에서 거의 사용되지 않는 아랍어 모음)을 추가한다면 (ً,ٍِ ‬,ٌ ‬) 및 Tashdid(ّ ‬) 둘다아닌 아랍어 이며, 둘 다 파르시가 아닌 아랍어 분음 부호의 하위 집합입니다. 우리는 46자로 끝납니다.이것은 의미합니다.\u0600-\u06FF필요한 것보다 209자가 더 들어 있습니다!

۷ 포인트로06F7는 숫자의 파르시 표현입니다.7그리고.٧ 포인트로0667는 같은 숫자의 아랍어 표현입니다. ۶는 파르시 숫자표다니현입를의 입니다.6그리고.٦는 같은 숫자의 아랍어 표현입니다.그리고 모두가 거주합니다.0600를 통하여06FF코드 포인트

4의 은 4입니다.۴5(), 5(۵( ) 및 6 ( )۶ 포인트가 는 아랍어에서 사용되는 모양과 다르며 다른 숫자들은 코드 포인트가 다릅니다.

파르시/페르시아어에도 존재하지 않는 다른 문자의 수를 볼 수 있으며 아무도 이름이나 성을 확인하면서 그것들을 가지려고 하지 않습니다.

[آ-ی]유효성 검사에 필요한 문자보다 훨씬 많은 117자를 포함합니다.Unicode CLDR을 사용하여 모든 항목을 볼 수 있습니다.

현재 정규식에 있는 것은 표준 아랍어 기호 범위입니다.추가 문자의 경우 별도로 정규식에 추가해야 합니다.코드는 다음과 같습니다.

ژ \u0698
پ \u067E
چ \u0686
گ \u06AF

그러니까 대체적으로 당신이 가져야 할 것은

^[\u0600-\u06FF\u0698\u067E\u0686\u06AF]+$

허용된 답변(https://stackoverflow.com/a/22565376/790811), 이외에도 Zero-width_non-joiner(또는 페르시아어로 نیلهفصا) 문자도 고려해야 합니다.유감스럽게도 우리는 그것을 위한 두 개의 기호를 가지고 있습니다.하나는 표준이고 다른 하나는 표준이 아니라 널리 사용됩니다.

  1. \u200C : http://en.wikipedia.org/wiki/Zero-width_non-joiner
  2. \u200F : 오른쪽에서 왼쪽으로 표시(http://unicode-table.com/en/ #200F)

따라서 최종 regix는 다음과 같습니다.

^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C\u200F]+$

"공간"을 고려하려면 다음을 사용할 수 있습니다.

^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF\u200C\u200F ]+$

다음을 통해 자바스크립트를 테스트할 수 있습니다.

/^[\u0600-\u06FF\uFB8A\u067E\u0686\u06AF7\u200C\u200F ]+$/.test('ای‌پسر تو چه می‌دانی؟')

주의: persianRex는 Javascript로 작성되지만 소스 코드를 사용하여 문자를 복사하여 붙여넣을 수 있습니다.

페르시아 문자를 감지하는 것은 키보드 레이아웃과 운영 체제가 다양하기 때문에 까다로운 작업입니다.저는 이전에도 같은 문제에 직면했고 이 문제를 해결하기 위해 오픈 소스 라이브러리를 작성하기로 결정했습니다.

다음과 같이 문제를 해결할 수 있습니다. persianRex.text.test(입력); // true 또는 false를 반환합니다.

다음은 전체 설명서입니다. http://imanmh.github.io/persianRex/

파르시, 다리, 타지크는 내가 아는 바가 아니지만 유니코드 코드 차트를 조금 뒤지면 아랍어가 5개의 유니코드 코드 블록을 포함한다는 것을 알 수 있습니다.

  • 아랍어: http://www.unicode.org/charts/PDF/U0600.pdf
  • 아랍어 부록: http://www.unicode.org/charts/PDF/U0750.pdf
  • 아랍어 확장-A: http://www.unicode.org/charts/PDF/U08A0.pdf
  • 아랍어 프레젠테이션 양식-A: http://www.unicode.org/charts/PDF/UFB50.pdf
  • 아랍어 프레젠테이션 양식-B: http://www.unicode.org/charts/PDF/UFE70.pdf

명시적인 코드 포인트 범위 대신 명명된 블록을 사용하여 정규식으로 이러한 값(최소 일부)을 얻을 수 있습니다.\p{IsArabicPresentationForms-A}앞의 목록에서 4번째 유니코드 블록을 제공합니다.

유니코드에서 페르시아어 컴퓨팅을 읽을 수도 있습니다. http://behdad.org/download/Publications/persiancomputing/a007.pdf

이름이 붙은 블록(예: \p{Arabic})은 페르시아 문자뿐만 아니라 전체 아랍어 스크립트를 포함합니다.

프레젠테이션 양식(u+FB50-u+FDFF)은 텍스트에 사용해서는 안 되며 표준 범위(u+0600-u+06)로 변환해야 합니다.FF).

페르시아어만 다루려면 다음이 필요합니다.

  • 표준 아랍어 범위를 벗어난 Farsi 문자의 하위 집합, 즉 (U+0621-U+0624, U+0626-U+0663A, U+0641-U+0642, U+0644-U+0648)
  • 표준 아랍어 분음 부호(U+064B-U+0652)
  • 추가 분음 부호 2개(U+0654, U+0670)
  • 4개의 추가 Farsi 문자 " چپژگ▁(" (U+067E, U+0686, U+0698, U+06AF)
  • U+06A9: 페르시아어 카프 (공식 명칭: "아랍 문자 케흐"; 아랍어 카프와는 다른 표기법)
  • U+06CC: Farsi Yeh (아랍어 Yeh와 다른 표기법)
  • U+200C: 제로 폭-비접합자

따라서 정규 표현식은 다음과 같습니다.

^[\u0621-\u0624\u0626-\u063A\u0641-\u0642\u0644-\u0648\u064B-\u0652\u067E\u0686\u0698\u06AF\u06CC\u06A9\u0654\u670\u200c}]+$

여기에 나열된 페르시아어 예제 문자도 참조하십시오.

http://unicode.org/cldr/trac/browser/trunk/common/main/fa.xml

정규식이 이를 수행하는 방법인지 확실하지 않지만, 문제는 페르시아어나 아랍어, 중국어, 러시아어 텍스트에만 국한되지 않습니다.그래서 아마도 당신은 당신의 코드 페이지에 캐릭터가 존재하는지 볼 수 있을 것이고, 코드 페이지에 없다면, 나는 사용자가 입력 장치를 사용하여 그것들을 삽입할 수 있을지 의심스럽습니다.

 var encoding = Encoding.GetEncoding(1256);
 var expect = "گ چ پ ژ";
 var actual= encoding.GetBytes("گ چ پ ژ");
 Assert.AreEqual(encoding.GetString(actual),expect);

이 테스트는 입력이 문자열과 바이트 및 백을 일치시켜야 하는 왕복을 테스트합니다.링크에는 지원되는 코드 페이지가 표시됩니다.

나는 정규식을 사용하여 페르시아 문자로 페르시아 전화 번호를 확인하는 것을 많이 검색했지만 적절한 답을 찾지 못했기 때문에 정규식으로 페르시아 번호를 확인하는 대신 페이산 번호를 영어로 변경하고 직접 확인하기로 결정했습니다. 이것이 나에게 많은 도움이 되길 바랍니다.

if (is_numeric($mobile) && strlen($mobile) == 11) {
      // if number in english
      }else{
            $mobile = str_split($mobile , 2);
            if (count($mobile) != 11) {
                return redirect()->back()->withErrors('فرمت شماره موبایل باید عدد و ۱۱ رقم باشد');
            }
            foreach ($mobile as $key => $number) {
                if ($number == '۰') {
                    $mobile[$key] = 0;
                }elseif ($number == '۱') {
                    $mobile[$key] = 1;
                }elseif ($number == '۲') {
                    $mobile[$key] = 2;
                }elseif ($number == '۳') {
                    $mobile[$key] = 3;
                }elseif ($number == '۴') {
                    $mobile[$key] = 4;
                }elseif ($number == '۵') {
                    $mobile[$key] = 5;
                }elseif ($number == '۶') {
                    $mobile[$key] = 6;
                }elseif ($number == '۷') {
                    $mobile[$key] = 7;
                }elseif ($number == '۸') {
                    $mobile[$key] = 8;
                }elseif ($number == '۹') {
                    $mobile[$key] = 9;
                }
            }
            $mobile = implode($mobile);
            if(is_numeric($mobile) == false){
                return redirect()->back()->withErrors('فرمت شماره موبایل باید عدد و ۱۱ رقم باشد');
            }
        }

이 코드를 당신에게 추가하세요.TextField또는TextFormField

예:

inputFormatters: [FilteringTextInputFormatter.allow(RegExp("[ آ-ی]"))],

빈 공간을 만들려면 다음에 공간을 입력합니다.RegEx목록.

♥♥♥خلاصه تمام حروف فارسی رو بدون مشکل میتونی داشته باشی برای فاصله بین حروف هم اسپیس کارو راه میندازه♥♥♥

언급URL : https://stackoverflow.com/questions/22565100/regex-for-accepting-only-persian-characters

반응형