Potrebujem extrahovať určitú časť reťazca Javascript. Myslel som, že to urobím s regex, ale nemohol prísť s tým, ktorý to robí správne.
Reťazec môže mať premenlivú dĺžku a môže obsahovať všetky možné znaky vo všetkých možných kombináciách.
Z toho musím extrahovať 10 susedných znakov, ktoré zodpovedajú jednej z nasledujúcich dvoch možných kombinácií:
- 9 číslic a 1 písmeno „X“ (veľké písmeno „X“, nie X ako variabilné písmeno!)
- 10 čísel
Ak je teda vstupný reťazec tento: „[1X,!? X22; 87654321X9] ddee“, mal by sa vrátiť iba „87654321X9“.
Dúfam, že som to vysvetlil dosť dobre. Ďakujem vopred!
odpovede:
3 pre odpoveď č. 1Tento Regex bude fungovať:
d{9}X|d{8}Xd|d{7}Xd{2}|d{6}Xd{3}|d{5}Xd{4}|d{4}Xd{5}|d{3}Xd{6}|d{2}Xd{7}|d{1}Xd{8}|d{10}|Xd{9}
Ako je opísané, musí sa zhodovať s 9 číslicami a akýmkoľvek písmenom a písmeno môže byť na ľubovoľnej pozícii v poradí.
d{9}X # will match 9 digits and a letter in the end
d{8}Xd # will match 8 digits a lettter then a digit again
...
d{1}Xd{8} # will match 1 digits a lettter then 8 digits
{10} # will match 10 digits
Upravené tak, aby sa zhodovalo iba s X
2 pre odpoveď č. 2
Môžete použiť tento oveľa jednoduchší regulárny výraz:
/(?!d*Xd*X)[dX]{10}/
RegEx Breakup:
(?!d*Xd*X) # negative lookahead to fail the match if there are 2 X ahead
[dX]{10} # match a digit or X 10 times
Pretože viac ako jeden X
nie je povolený z dôvodu použitia negatívneho hľadáčika, tento regulárny výraz povoľuje iba 10 číslic alebo ekse 9 číslic a jednu X
.
Tento regex má oproti druhej odpovedi niekoľko výhod:
- Oveľa jednoduchší regulárny výraz, ktorý je ľahšie čitateľný a udržiavateľný
- Vykoná sa menej ako polovica krokov, čo môže byť podstatný rozdiel pri väčšom texte.