නිත්‍ය ප්‍රකාශන වලදී අල්ලා නොගන්නා කණ්ඩායමක් යනු කුමක්ද?


1792

අල්ලා නොගන්නා කණ්ඩායම්, එනම් (?:), සාමාන්‍ය ප්‍රකාශන සඳහා භාවිතා කරන්නේ කෙසේද සහ ඒවා හොඳ කුමක්ද?


44
මෙම ප්‍රශ්නය "කණ්ඩායම්" යටතේ, ගොඩගැසී ඇති නිත්‍ය ප්‍රකාශන නිති අසන ප්‍රශ්නවලට එකතු කර ඇත .
aliteralmind

Answers:


2357

මෙය උදාහරණයක් සමඟ පැහැදිලි කිරීමට උත්සාහ කරමි.

පහත පා text ය සලකා බලන්න:

http://stackoverflow.com/
/programming/tagged/regex

දැන්, මම ඊට පහළින් රීජෙක්ස් යොදන්නේ නම් ...

(https?|ftp)://([^/\r\n]+)(/[^\r\n]*)?

... මට පහත ප්‍රති result ලය ලැබෙනු ඇත:

Match "http://stackoverflow.com/"
     Group 1: "http"
     Group 2: "stackoverflow.com"
     Group 3: "/"

Match "/programming/tagged/regex"
     Group 1: "https"
     Group 2: "stackoverflow.com"
     Group 3: "/questions/tagged/regex"

නමුත් මම ප්‍රොටෝකෝලය ගැන තැකීමක් නොකරමි - මට අවශ්‍ය වන්නේ URL හි ධාරකය සහ මාර්ගයයි. එබැවින්, අල්ලා නොගන්නා කණ්ඩායම ඇතුළත් කිරීම සඳහා මම රීජෙක්ස් වෙනස් කරමි (?:).

(?:https?|ftp)://([^/\r\n]+)(/[^\r\n]*)?

දැන්, මගේ ප්‍රති result ලය මේ වගේ ය:

Match "http://stackoverflow.com/"
     Group 1: "stackoverflow.com"
     Group 2: "/"

Match "/programming/tagged/regex"
     Group 1: "stackoverflow.com"
     Group 2: "/questions/tagged/regex"

බලන්න? පළමු කණ්ඩායම අල්ලාගෙන නොමැත. පා par ය පෙළට ගැලපීම සඳහා එය භාවිතා කරයි, නමුත් අවසාන ප්‍රති .ලයේදී එය නොසලකා හරියි.


සංස්කරණය කරන්න:

ඉල්ලා ඇති පරිදි, කණ්ඩායම් ද පැහැදිලි කිරීමට උත්සාහ කරමි.

කණ්ඩායම් බොහෝ අරමුණු ඉටු කරයි. විශාල ගැලපීමකින් නිශ්චිත තොරතුරු උකහා ගැනීමට ඔවුන්ට ඔබට උදව් කළ හැකිය (ඒවා නම් කළ හැකිය), කලින් ගැලපෙන කණ්ඩායමක් නැවත ගැලපීමට ඔවුන් ඔබට ඉඩ දෙයි, සහ ආදේශක සඳහා භාවිතා කළ හැකිය. අපි උදාහරණ කිහිපයක් උත්සාහ කරමු නේද?

ඔබට යම් ආකාරයක XML හෝ HTML එකක් ඇතැයි සිතන්න ( රීජෙක්ස් කාර්යය සඳහා හොඳම මෙවලම නොවන බව මතක තබා ගන්න , නමුත් එය උදාහරණයක් ලෙස හොඳයි). ඔබට ටැග් විග්‍රහ කිරීමට අවශ්‍යයි, එවිට ඔබට මේ වගේ දෙයක් කළ හැකිය (තේරුම් ගැනීම පහසු කිරීම සඳහා මම අවකාශයන් එකතු කර ඇත්තෙමි):

   \<(?<TAG>.+?)\> [^<]*? \</\k<TAG>\>
or
   \<(.+?)\> [^<]*? \</\1\>

පළමු රීජෙක්ස් නම් කරන ලද කණ්ඩායමක් (TAG) ඇති අතර දෙවැන්න පොදු කණ්ඩායමක් භාවිතා කරයි. රීජෙක්ස් දෙකම එකම දේ කරයි: අවසාන ටැගයට ගැලපීම සඳහා ඔවුන් පළමු කණ්ඩායමේ (ටැගයේ නම) අගය භාවිතා කරයි. වෙනස වන්නේ පළමුවැන්නා වටිනාකමට ගැලපෙන ලෙස නම භාවිතා කරන අතර දෙවැන්න කණ්ඩායම් දර්ශකය භාවිතා කරයි (එය 1 සිට ආරම්භ වේ).

දැන් අපි ආදේශක කිහිපයක් උත්සාහ කරමු. පහත පා text ය සලකා බලන්න:

Lorem ipsum dolor sit amet consectetuer feugiat fames malesuada pretium egestas.

දැන්, අපි මේ ගොළු රීජෙක්ස් එක උඩින් භාවිතා කරමු:

\b(\S)(\S)(\S)(\S*)\b

මෙම රීජෙක්ස් අවම වශයෙන් අක්ෂර 3 ක් සහිත වචන සමඟ ගැලපෙන අතර පළමු අක්ෂර තුන වෙන් කිරීමට කණ්ඩායම් භාවිතා කරයි. ප්රති result ලය මෙයයි:

Match "Lorem"
     Group 1: "L"
     Group 2: "o"
     Group 3: "r"
     Group 4: "em"
Match "ipsum"
     Group 1: "i"
     Group 2: "p"
     Group 3: "s"
     Group 4: "um"
...

Match "consectetuer"
     Group 1: "c"
     Group 2: "o"
     Group 3: "n"
     Group 4: "sectetuer"
...

එබැවින්, අපි ආදේශන නූල යොදන්නේ නම්:

$1_$3$2_$4

... ඊට ඉහළින්, අපි උත්සාහ කරන්නේ පළමු කණ්ඩායම භාවිතා කිරීමට, යටි ඉරි ලකුණු එකතු කිරීමට, තුන්වන කණ්ඩායම භාවිතා කිරීමට, දෙවන කණ්ඩායම, තවත් යටි ඉරි ලකුණු එකතු කරන්න, ඉන්පසු හතරවන කණ්ඩායම. එහි ප්‍රති string ලයක් ලෙස පහත දැක්වෙන නූල සමාන වේ.

L_ro_em i_sp_um d_lo_or s_ti_ a_em_t c_no_sectetuer f_ue_giat f_ma_es m_la_esuada p_er_tium e_eg_stas.

ඔබට ආදේශක සඳහා නම් කළ කණ්ඩායම් ද භාවිතා කළ හැකිය ${name}.

රීජෙක්ස් සමඟ සෙල්ලම් කිරීමට, මම නිර්දේශ කරන්නේ http://regex101.com/ , එය රීජෙක්ස් ක්‍රියා කරන ආකාරය පිළිබඳ හොඳ තොරතුරු ප්‍රමාණයක් සපයයි; එය තෝරා ගැනීමට රීජෙක්ස් එන්ජින් කිහිපයක් ද ඉදිරිපත් කරයි.


3
jajsie: ඔබ ප්‍රති .ල මත ආදේශන මෙහෙයුමක් කරන්නේ නම් සාම්ප්‍රදායික (අල්ලා ගැනීමේ) කණ්ඩායම් වඩාත් ප්‍රයෝජනවත් වේ. මෙන්න මම කොමා වලින් වෙන් කරන ලද අන්තිම සහ මුල් නම් අල්ලාගෙන ඔවුන්ගේ ඇණවුම ආපසු හරවන උදාහරණයකි (නම් කරන ලද කණ්ඩායම් වලට ස්තූතියි) ... regexhero.net/tester/?id=16892996-64d4-4f10-860a-24f28dad7e30
ස්ටීව්

2
නැත, එය සමාන නොවේ.
රිකාඩෝ නොල්ඩ්

4
රීජෙක්ස් බෙදීම් පරිසීමක ලෙස භාවිතා කිරීමේදී අල්ලා නොගන්නා කණ්ඩායම් අද්විතීය ලෙස ප්‍රයෝජනවත් වන බව ද පෙන්වා දිය හැකිය: "ඇලිස් සහ බොබ්" -ප්ලිට් "+ s + (?: සහ | හෝ) \ s +"
යෙව්ගීනී

7
අල්ලා නොගන්නා කණ්ඩායම් (? :) අතර වෙනස තිබීම සිත්ගන්නාසුළු වනු ඇති අතර, බැලූ බැල්මට සහ බැලූ බැල්මට (? =,?!) පැහැදිලි කර ඇත. මම සාමාන්‍ය ප්‍රකාශන ගැන ඉගෙන ගැනීමට පටන් ගත්තෙමි, නමුත් මා තේරුම් ගත් පරිදි, අල්ලා නොගන්නා කණ්ඩායම් ගැලපීම සඳහා භාවිතා කරන අතර ඒවා ගැලපෙන දේ "ආපසු" ලබා දේ, නමුත් එම "ප්‍රතිලාභ අගය" පසු-යොමු කිරීම සඳහා "ගබඩා" නොවේ. අනෙක් අතට බැලූ බැල්මට සහ බැලීමට පිටුපස ඇති ප්‍රකාශයන් "ගබඩා" කිරීම පමණක් නොව, ඒවා තරඟයක කොටසක් ද නොවේ, ඔවුන් යමක් තරයේ ගැලපෙනු ඇතැයි කියා සිටියි, නමුත් ඔවුන්ගේ "ගැලපුම්" අගය නොසලකා හරිනු ලැබේ, මම වරදවා වටහා නොගත්තොත් .. (මම දළ වශයෙන් නිවැරදිද?)
ක්‍රිස්තියානි

5
[] කට්ටලයක්; [123] කට්ටලය තුළ ඇති ඕනෑම වර්‍ගයකට වරක් ගැලපේ; [3 123] එක් වරක් කට්ටලය තුළ නැති ඕනෑම දෙයකට ගැලපේ; [^ / \ r \ n] +, /, \ r, \ n ට වඩා වෙනස් අක්ෂර එකක් හෝ කිහිපයක් ගැලපේ.
රිකාඩෝ නොල්ඩ්

182

ප්‍රකාශනයක් සංවිධානය කිරීමට හා විග්‍රහ කිරීමට ඔබට අල්ලා ගැනීමේ කණ්ඩායම් භාවිතා කළ හැකිය. අල්ලා නොගන්නා කණ්ඩායමකට පළමු ප්‍රතිලාභය ඇත, නමුත් දෙවැන්නෙහි පොදු කාර්යයක් නොමැත. අල්ලා ගත නොහැකි කණ්ඩායමක් විකල්පයක් යැයි ඔබට තවමත් පැවසිය හැකිය.

ඔබට සංඛ්‍යාත්මක පෙළ ගැලපීමට අවශ්‍ය යැයි පවසන්න, නමුත් සමහර අංක 1, 2, 3, 4, ලෙස ලිවිය හැකිය ... ඔබට සංඛ්‍යාත්මක කොටස ග්‍රහණය කර ගැනීමට අවශ්‍ය නම්, නමුත් (විකල්ප) උපසර්ගය නොව ඔබට අල්ලා නොගන්නා කණ්ඩායමක් භාවිතා කළ හැකිය .

([0-9]+)(?:st|nd|rd|th)?

එය 1, 2, 3 ... හෝ 1, 2, 3, ... යන ආකෘති වලට අනුරූප වේ ... නමුත් එය ග්‍රහණය කරගන්නේ සංඛ්‍යාත්මක කොටස පමණි.


3
සංක්ෂිප්ත හා බොහෝ විට මෙහි හොඳම පැහැදිලි කිරීම.
නෙල්සන්ගොන්

109

?: ඔබට ප්‍රකාශනයක් කාණ්ඩ කිරීමට අවශ්‍ය විට භාවිතා වේ, නමුත් එය නූලට ගැලපෙන / අල්ලා ගත් කොටසක් ලෙස සුරැකීමට ඔබට අවශ්‍ය නැත.

උදාහරණයක් ලෙස IP ලිපිනයකට ගැලපෙන දෙයක් වනු ඇත:

/(?:\d{1,3}\.){3}\d{1,3}/

පළමු අෂ්ටක 3 සුරැකීම ගැන මා තැකීමක් නොකරන බව සලකන්න, නමුත් (?:...)කණ්ඩායම්ගත කිරීම මඟින් තරඟයක් අල්ලා ගැනීමේ හා ගබඩා කිරීමේ පොදු කාර්යයට යටත් නොවී රීජෙක්ස් කෙටි කිරීමට මට ඉඩ ලබා දේ.


38

එමඟින් කණ්ඩායම අල්ලා නොගන්නා බවට පත් කරයි, එයින් අදහස් කරන්නේ එම කණ්ඩායමට ගැලපෙන උපස්ථරය අල්ලා ගැනීමේ ලැයිස්තුවට ඇතුළත් නොවන බවයි. වෙනස නිදර්ශනය කිරීම සඳහා රූබියේ උදාහරණයක්:

"abc".match(/(.)(.)./).captures #=> ["a","b"]
"abc".match(/(?:.)(.)./).captures #=> ["b"]

අපට "abc" .match (/.(.)./) භාවිතා කළ නොහැක්කේ ඇයි?
ප්‍රසන්නා සාරාෆ්

RPRASANNASARAF ඔබට ඇත්තෙන්ම හැකිය. කේතයේ කාරණය වූයේ (?:)අල්ලා ගැනීමක් සිදු නොවන බව පෙන්වීම මිස ප්‍රයෝජනවත් උදාහරණයක් පෙන්වීම නොවේ (?:). (?:)ඔබට උප ප්‍රකාශනයක් කාණ්ඩ කිරීමට අවශ්‍ය විට එය ප්‍රයෝජනවත් වේ (ඔබට පරමාණුක නොවන උප ප්‍රකාශනයකට ප්‍රමාණාත්මකව යෙදීමට අවශ්‍ය විට හෝ a හි විෂය පථය සීමා කිරීමට අවශ්‍ය නම් කියන්න |), නමුත් ඔබට කිසිවක් ග්‍රහණය කර ගැනීමට අවශ්‍ය නැත.
sepp2k

27

OT තිහාසික චලනය:

අල්ලා නොගන්නා කණ්ඩායම්වල පැවැත්ම වරහන් භාවිතයෙන් පැහැදිලි කළ හැකිය.

පැවසූ දේ සලකා බලන්න (a|b)cසහ a|bcඅධික, අකාර ප්රමුඛතා හේතුවෙන් |මෙම ගුණාංග දෙක විවිධ භාෂා (නියෝජනය, {ac, bc}හා {a, bc}පිළිවෙළින්).

කෙසේ වෙතත්, වරහන් වර්‍ගය ගැලපෙන කණ්ඩායමක් ලෙසද භාවිතා කරයි (අනෙක් පිළිතුරු මගින් පැහැදිලි කර ඇති පරිදි ...).

ඔබට වරහන් ලබා ගැනීමට අවශ්‍ය නමුත් උප ප්‍රකාශනය ග්‍රහණය කර නොගැනීමේදී ඔබ NON-CAPTURING GROUPS භාවිතා කරයි. උදාහරණයක් ලෙස,(?:a|b)c


6
ඇයි කියලා මම කල්පනා කළා. මා සිතන පරිදි මෙම තොරතුරු කටපාඩම් කිරීම සඳහා "ඇයි" අත්‍යවශ්‍ය වේ.
ජේඑම්අයි මැඩිසන්

22

උදාහරණයක් සමඟ මෙය උත්සාහ කිරීමට මට ඉඩ දෙන්න:

රීජෙක්ස් කේතය: (?:animal)(?:=)(\w+)(,)\1\2

නූල් සොයන්න:

1 වන පේළිය - animal=cat,dog,cat,tiger,dog

2 වන පේළිය - animal=cat,cat,dog,dog,tiger

3 වන පේළිය - animal=dog,dog,cat,cat,tiger

(?:animal) -> අල්ලා නොගත් කාණ්ඩ 1

(?:=)-> අල්ලා නොගත් කණ්ඩායම 2

(\w+)-> 1 වන කණ්ඩායම අල්ලා ගන්නා ලදි

(,)-> අල්ලා ගත් 2 වන කණ්ඩායම

\1 -> අල්ලා ගත් 1 වන කාණ්ඩයේ ප්‍රති result ලය එනම් 1 වන පේළියේ බළලෙකි, 2 වන පේළියේ බළලෙකි, 3 වන පේළියේ බල්ලෙකි.

\2 -> අල්ලා ගත් 2 වන කාණ්ඩයේ ප්‍රති result ලය එනම් කොමාව (,)

එබැවින් මෙම කේතය ලබා දීමෙන් \1සහ \2අල්ලා ගත් 1 සහ 2 කාණ්ඩයේ ප්‍රති result ල පිළිවෙලින් පසුව කේතයෙන් සිහිපත් කරමු.

කේත අනුපිළිවෙලට අනුව (?:animal)1 වන කාණ්ඩය (?:=)විය යුතු අතර 2 වන කාණ්ඩය විය යුතුය.

නමුත් ?:අපි ලබා දීමෙන් අපි තරඟ කණ්ඩායම අල්ලා නොගන්නා බවට පත් කරමු (ඒවා නොගැලපෙන කාණ්ඩයෙන් ගණන් නොගනී, එබැවින් කණ්ඩායම් අංකය ආරම්භ වන්නේ පළමු අල්ලා ගත් කණ්ඩායමෙන් මිස අල්ලා නොගත් අයගෙන් නොවේ), එවිට තරඟ කණ්ඩායමේ ප්‍රති result ලය පුනරාවර්තනය වේ. (?:animal)පසුව කේතයෙන් ඇමතිය නොහැක.

අල්ලා නොගන්නා කණ්ඩායම් භාවිතය මෙය පැහැදිලි කරයි යැයි සිතමු.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


15

කණ්ඩායම් අල්ලා ඔබ ගැලපෙන පරිදි regex දී මත පසුව භාවිතා කළ හැක හෝ ඔබ regex ආදේශ කොටසක් ඔවුන් භාවිතා කළ හැකිය. අල්ලා නොගන්නා කණ්ඩායමක් සෑදීම හුදෙක් එම කණ්ඩායම මෙම හේතු දෙකෙන්ම භාවිතා කිරීමෙන් නිදහස් කරයි.

ඔබ විවිධ දේ ග්‍රහණය කර ගැනීමට උත්සාහ කරන්නේ නම් සහ අල්ලා ගැනීමට අවශ්‍ය නොවන සමහර කණ්ඩායම් තිබේ නම් අල්ලා නොගන්නා කණ්ඩායම් විශිෂ්ටයි.

ඒවා පැවතීමට හේතුව එයයි. ඔබ කණ්ඩායම් ගැන ඉගෙන ගන්නා අතරතුර, පරමාණුක කණ්ඩායම් ගැන ඉගෙන ගන්න , ඔවුන් බොහෝ දේ කරයි! බැලීමේ කණ්ඩායම් ද ඇත, නමුත් ඒවා ටිකක් සංකීර්ණ වන අතර එතරම් භාවිතා නොවේ.

පසුකාලීනව රීජෙක්ස් හි භාවිතා කිරීමේ උදාහරණය (පසු විපරම):

<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1> [Xml ටැගයක් සොයා ගනී (ns සහාය නොමැතිව)]

([A-Z][A-Z0-9]*) අල්ලා ගැනීමේ කණ්ඩායමකි (මේ අවස්ථාවේ දී එය ටැග් නාමය වේ)

පසුකාලීනව රීජෙක්ස් හි \1අර්ථය වන්නේ එය පළමු කණ්ඩායමට ( ([A-Z][A-Z0-9]*)කණ්ඩායමට) සමාන වූ පෙළට පමණක් ගැලපෙන බවයි (මේ අවස්ථාවේ දී එය අවසාන ටැගයට ගැලපේ).


හෝ එය ගැලපීමට පසුව භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ සරල උදාහරණයක් ඔබට දිය හැකිද?
never_had_a_name

මම අදහස් කළේ ඔබට පසුව ගැලපීමට භාවිතා කළ හැකිය, නැතහොත් ප්‍රතිස්ථාපනය කිරීමේදී ඔබට එය භාවිතා කළ හැකිය. හෝ එම වාක්‍යයේ දී අල්ලා ගැනීමේ කණ්ඩායමක් සඳහා භාවිතයන් දෙකක් ඇති බව පෙන්වීමට පමණි
බොබ් ෆින්චයිමර්

9

හොඳයි, මම ජාවාස්ක්‍රිප්ට් සංවර්ධකයෙක් වන අතර ජාවාස්ක්‍රිප්ට් වලට අදාළ එහි වැදගත්කම පැහැදිලි කිරීමට උත්සාහ කරමි.

cat is animal බළලෙකු හා සතෙකු ගැලපීමට ඔබ කැමති විට ඔබට ගැලපීමට අවශ්‍ය අවස්ථාවක් සලකා බලන්න is.

 // this will ignore "is" as that's is what we want
"cat is animal".match(/(cat)(?: is )(animal)/) ;
result ["cat is animal", "cat", "animal"]

 // using lookahead pattern it will match only "cat" we can
 // use lookahead but the problem is we can not give anything
 // at the back of lookahead pattern
"cat is animal".match(/cat(?= is animal)/) ;
result ["cat"]

 //so I gave another grouping parenthesis for animal
 // in lookahead pattern to match animal as well
"cat is animal".match(/(cat)(?= is (animal))/) ;
result ["cat", "cat", "animal"]

 // we got extra cat in above example so removing another grouping
"cat is animal".match(/cat(?= is (animal))/) ;
result ["cat", "animal"]

7

සංකීර්ණ නිත්‍ය ප්‍රකාශන වලදී ඔබට කණ්ඩායම් විශාල සංඛ්‍යාවක් භාවිතා කිරීමට අවශ්‍ය තත්වයක් ඇතිවිය හැකිය, ඒවායින් සමහරක් පුනරාවර්තන ගැලපීම සඳහා ඇති අතර සමහර ඒවා නැවත යොමු කිරීම් සඳහා ඇත. පෙරනිමියෙන් සෑම කණ්ඩායමකටම ගැලපෙන පෙළ පසුබිම් අරා වෙත පටවනු ලැබේ. අපට කණ්ඩායම් විශාල ප්‍රමාණයක් ඇති අතර ඒවායින් සමහරක් පසු විපරම් අරාවෙන් යොමු කිරීමට පමණක් අවශ්‍ය නම්, මෙම පෙරනිමි හැසිරීම අභිබවා යා හැකි අතර, ඇතැම් කණ්ඩායම් එහි ඇත්තේ පුනරාවර්තන හැසිරවීම සඳහා පමණක් වන අතර ඒවා අල්ලාගෙන ගබඩා කිරීම අවශ්‍ය නොවේ. පසු විපරම් අරාව තුළ.


7

මෙය කීමට මට ඉහළ පිළිතුරු ගැන අදහස් දැක්විය නොහැක: ඉහළ පිළිතුරුවල පමණක් ඇඟවෙන පැහැදිලි කරුණක් එක් කිරීමට මම කැමැත්තෙමි:

අල්ලා (?...) නොගන්නා කණ්ඩායම මුල් සම්පූර්ණ ගැලපුමෙන් කිසිදු අක්ෂරයක් ඉවත් නොකරයි , එය දෘශ්‍යමය වශයෙන් රෙජෙක්ස් ක්‍රමලේඛකයාට ප්‍රතිසංවිධානය කරයි.

නිර්වචනය කරන ලද බාහිර අක්ෂර නොමැතිව රීජෙක්ස් හි නිශ්චිත කොටසකට ප්‍රවේශ වීමට ඔබ සැමවිටම භාවිතා කළ යුතුය .group(<index>)


2
ඉතිරි පිළිතුරු වල නැතිවූ වැදගත්ම ඉඟිය ඔබ සපයා ඇත. මම ඔවුන් තුළ ඇති සියලුම උදාහරණ අත්හදා බැලුවෙමි. මම වැරදුන තැන මට පෙන්වූයේ ඔබගේ පළ කිරීම පමණි.
ශේෂාද්‍රි ආර්

එය ඇසීම සතුටක්!
ස්කොට් ඇන්ඩර්සන්

6

මා හමු වූ එක් සිත්ගන්නා කරුණක් නම්, අල්ලා නොගන්නා කණ්ඩායමක් තුළ ඔබට අල්ලා ගැනීමේ කණ්ඩායමක් සිටිය හැකි වීමයි. වෙබ් යූආර්එල් ගැලපීම සඳහා පහත රීජෙක්ස් දෙස බලන්න:

var parse_url_regex = /^(?:([A-Za-z]+):)(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;

ආදාන url string:

var url = "http://www.ora.com:80/goodparts?q#fragment";

මගේ regex දී පළමු කණ්ඩායම (?:([A-Za-z]+):)වාහකයක් යෝජනා ක්රමය සහ මහ බඩවැලේ හා ගැලපෙන නොවන අල්ලා කණ්ඩායමක් :චරිතය එනම් http:මම පහත දැක්වෙන කෝඩ් ධාවනය වූ විට නමුත්, මම ආපසු අරාව 1 දර්ශකය වැල අඩංගු විය දකින httpමම කල්පනා කරන විට httpසහ මහ බඩවැලේ :අල්ලා නොගන්නා කණ්ඩායමක් තුළ සිටින බැවින් දෙදෙනාම වාර්තා නොවනු ඇත.

console.debug(parse_url_regex.exec(url));

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මම සිතුවේ පළමු කණ්ඩායම (?:([A-Za-z]+):)ග්‍රහණය කර නොගන්නා කණ්ඩායමක් නම් එය httpප්‍රතිදාන අරාව තුළ නැවත ලබා දෙන්නේ මන්ද යන්නයි .

එබැවින් ([A-Za-z]+)අල්ලා නොගන්නා කණ්ඩායම තුළ කූඩු සමූහයක් ඇති බව ඔබ දුටුවහොත්. එම කැදැලි කණ්ඩායම ([A-Za-z]+)අල්ලා නොගන්නා කණ්ඩායමක් තුළ ( ?:ආරම්භයේ නොතිබීම) අල්ලා ගන්නා කණ්ඩායමකි (?:([A-Za-z]+):). එම නිසා පෙළ httpතවමත් ග්‍රහණය වී ඇති නමුත් අල්ලා :නොගන්නා කණ්ඩායම තුළ ඇති නමුත් ග්‍රහණය කර ගන්නා කණ්ඩායමට පිටතින් ඇති බඩවැල් චරිතය ප්‍රතිදාන අරාව තුළ වාර්තා නොවේ.


6

tl; dr අල්ලා නොගන්නා කණ්ඩායම්, නමට අනුව, ඔබ තරඟයට ඇතුළත් කිරීමට අකමැති රීජෙක්ස් හි කොටස් වන අතර ?:කණ්ඩායමක් අල්ලා නොගන්නා ලෙස අර්ථ දැක්වීමේ මාර්ගයකි.

ඔබට ඊමේල් ලිපිනයක් ඇති බව කියමු example@example.com. පහත දැක්වෙන රීජෙක්ස් විසින් කණ්ඩායම් දෙකක් නිර්මාණය කරනු ඇත , එනම් id කොටස සහ @ example.com කොටස. (\p{Alpha}*[a-z])(@example.com). සරල බව උදෙසා, අපි @චරිතය ඇතුළුව සමස්ත ඩොමේන් නාමය උපුටා ගනිමු .

දැන් අපි කියමු, ඔබට අවශ්‍ය වන්නේ ලිපිනයේ හැඳුනුම් කොටස පමණි. ඔබට කිරීමට අවශ්‍ය වන්නේ තරඟ ()ප්‍රති result ලයේ පළමු කණ්ඩායම අල්ලා ගැනීමයි, එය රිජෙක්ස් වලින් වටවී ඇති අතර මෙය කළ හැකි ක්‍රමය වන්නේ අල්ලා නොගන්නා කණ්ඩායම් වාක්‍ය ඛණ්ඩය භාවිතා කිරීමයි ?:. එබැවින් රීජෙක්ස් (\p{Alpha}*[a-z])(?:@example.com)ඊමේල් එකේ හැඳුනුම් කොටස පමණක් ලබා දෙනු ඇත.


2

ඔබගේ Google Chrome devTools විවෘත කර කොන්සෝලය පටිත්ත විවෘත කර මෙය ටයිප් කරන්න:

"Peace".match(/(\w)(\w)(\w)/)

එය ක්‍රියාත්මක කරන්න එවිට ඔබට පෙනෙනු ඇත:

["Pea", "P", "e", "a", index: 0, input: "Peace", groups: undefined]

මෙම JavaScriptRegExp එන්ජින් ග්රහණ කණ්ඩායම් තුනක්, දර්ශක 1,2,3 සමග භාණ්ඩ. දැන් ප්‍රති .ලය බැලීමට ග්‍රහණය කර නොගත් සලකුණ භාවිතා කරන්න.

"Peace".match(/(?:\w)(\w)(\w)/)

ප්රති result ලය:

["Pea", "e", "a", index: 0, input: "Peace", groups: undefined]

අල්ලා නොගන්නා කණ්ඩායම යනු කුමක්ද යන්න මෙය පැහැදිලිය.


2

මම හිතන්නේ මම ඔබට පිළිතුර දෙන්නම්. තරගය සාර්ථකදැයි පරීක්ෂා නොකර ග්‍රහණ විචල්‍යයන් භාවිතා නොකරන්න.

$1තරගය සාර්ථක වුවහොත් අල්ලා ගැනීමේ විචල්‍යයන් යනාදිය වලංගු නොවන අතර ඒවා නිෂ්කාශනය නොකෙරේ.

#!/usr/bin/perl  
use warnings;
use strict;   
$_ = "bronto saurus burger";
if (/(?:bronto)? saurus (steak|burger)/)
{
    print "Fred wants a  $1";
}
else
{
    print "Fred dont wants a $1 $2";
}

ඉහත නිදසුනේ, දී bronto අල්ලා වළක්වා ගැනීමට $1, (?:)භාවිතා කරනු ඇත.

රටාව ගැලපෙන්නේ නම්, $1ඊළඟ කාණ්ඩගත රටාව ලෙස අල්ලා ගනු ලැබේ.

එබැවින්, ප්‍රතිදානය පහත පරිදි වේ:

Fred wants a burger

තරඟ සුරැකීමට ඔබට අවශ්‍ය නැතිනම් එය ප්‍රයෝජනවත් වේ.


1

එහි අතිශය සරල, සරල දිනය උදාහරණයකින් අපට තේරුම් ගත හැකිය, දිනය 2019 ජනවාරි 1 හෝ 2019 මැයි 2 හෝ වෙනත් දිනයක් ලෙස සඳහන් කර ඇත්නම් සහ එය dd / mm / yyyy ආකෘතියට පරිවර්තනය කිරීමට අපට අවශ්‍ය නම් අපට මාසය අවශ්‍ය නොවනු ඇත. එම කාරණය සඳහා ජනවාරි හෝ පෙබරවාරි යන නම, එබැවින් සංඛ්‍යාත්මක කොටස ග්‍රහණය කර ගැනීම සඳහා, නමුත් (විකල්ප) උපසර්ගය නොව ඔබට අල්ලා නොගන්නා කණ්ඩායමක් භාවිතා කළ හැකිය.

එබැවින් නිත්‍ය ප්‍රකාශනය වනුයේ,

([0-9]+)(?:January|February)?

එය එතරම්ම සරල ය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.