ජාවාස්ක්‍රිප්ට් නිත්‍ය ප්‍රකාශනයකින් ඔබ ගැලපෙන කණ්ඩායම් වෙත ප්‍රවේශ වන්නේ කෙසේද?


1382

මට සාමාන්‍ය ප්‍රකාශනයක් භාවිතා කරමින් නූලක කොටසක් ගැලපීමට අවශ්‍ය වන අතර පසුව වරහන් කළ උපස්ථරයට ප්‍රවේශ වන්න:

var myString = "something format_abc"; // I want "abc"

var arr = /(?:^|\s)format_(.*?)(?:\s|$)/.exec(myString);

console.log(arr);     // Prints: [" format_abc", "abc"] .. so far so good.
console.log(arr[1]);  // Prints: undefined  (???)
console.log(arr[0]);  // Prints: format_undefined (!!!)

මම වැරදි කරන්නේ කුමක් ද?


ඉහත නිත්‍ය ප්‍රකාශන කේතයේ කිසිදු වරදක් නොමැති බව මම සොයා ගතිමි: මා විසින් පරීක්‍ෂා කළ සත්‍ය නූල මෙයයි:

"date format_%A"

"% A" නිර්වචනය කර නොමැති බව වාර්තා කිරීම ඉතා අමුතු හැසිරීමක් සේ පෙනේ, නමුත් එය මෙම ප්‍රශ්නයට directly ජුව සම්බන්ධ නොවේ, එබැවින් මම නව එකක් විවෘත කර ඇත්තෙමි, ගැලපෙන උපස්ථරයක් ජාවාස්ක්‍රිප්ට් හි "නිර්වචනය නොකළ" ලෙස ආපසු එන්නේ ඇයි? .


ගැටළුව වූයේ console.logඑහි පරාමිතීන් printfප්‍රකාශයක් ලෙස ගැනීම වන අතර, මම ලොග් වූ ( "%A") නූලට විශේෂ අගයක් ඇති බැවින්, එය ඊළඟ පරාමිතියේ වටිනාකම සොයා ගැනීමට උත්සාහ කරයි.

Answers:


1693

ඔබට මෙවැනි අල්ලා ගැනීමේ කණ්ඩායම් වලට ප්‍රවේශ විය හැකිය:

var myString = "something format_abc";
var myRegexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;
var match = myRegexp.exec(myString);
console.log(match[1]); // abc

බහුවිධ ගැලපීම් තිබේ නම් ඔබට ඒවා නැවත කියවිය හැකිය:

var myString = "something format_abc";
var myRegexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;
match = myRegexp.exec(myString);
while (match != null) {
  // matched text: match[0]
  // match start: match.index
  // capturing group n: match[n]
  console.log(match[0])
  match = myRegexp.exec(myString);
}

සංස්කරණය කරන්න: 2019-09-10

ඔබට පෙනෙන පරිදි බහුවිධ තරඟ හරහා නැවත ගමන් කිරීමේ මාර්ගය එතරම්ම බුද්ධිමත් නොවීය. මෙය String.prototype.matchAllක්රමයේ යෝජනාවට මග පාදයි . මෙම නව ක්‍රමය නැව්ගත කිරීමට අපේක්ෂා කෙරේ ECMAScript 2020 පිරිවිතරයෙන් . එය අපට පිරිසිදු API එකක් ලබා දෙන අතර විවිධ ගැටලු විසඳයි. එය ක්‍රෝම් 73+ / නෝඩ් 12+ සහ ෆයර්ෆොක්ස් 67+ ලෙස ප්‍රධාන බ්‍රව්සර් සහ ජේඑස් එන්ජින් මත ගොඩ බැසීමට පටන් ගෙන ඇත.

මෙම ක්‍රමය මඟින් iterator එකක් ලබා දෙන අතර එය පහත පරිදි භාවිතා කරයි:

const string = "something format_abc";
const regexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;
const matches = string.matchAll(regexp);
    
for (const match of matches) {
  console.log(match);
  console.log(match.index)
}

එය නැවත ක්‍රියාකාරී වන විට, එය කම්මැලි යැයි අපට පැවසිය හැකිය, විශේෂයෙන් අල්ලා ගැනීමේ කණ්ඩායම් විශාල සංඛ්‍යාවක් හෝ ඉතා විශාල නූල් හැසිරවීමේදී මෙය ප්‍රයෝජනවත් වේ. නමුත් ඔබට අවශ්‍ය නම්, පැතිරෙන සින්ටැක්ස් හෝ Array.fromක්‍රමය භාවිතා කිරීමෙන් ප්‍රති result ලය පහසුවෙන් අරාව බවට පරිවර්තනය කළ හැකිය :

function getFirstGroup(regexp, str) {
  const array = [...str.matchAll(regexp)];
  return array.map(m => m[1]);
}

// or:
function getFirstGroup(regexp, str) {
  return Array.from(str.matchAll(regexp), m => m[1]);
}

මේ අතර, මෙම යෝජනාවට වඩාත් පුළුල් සහයෝගයක් ලැබෙන අතර, ඔබට එය භාවිතා කළ හැකිය නිල ෂිම් පැකේජය .

එසේම, ක්රමයේ අභ්යන්තර කටයුතු සරල ය. උත්පාදක ශ්‍රිතයක් භාවිතා කරමින් සමාන ක්‍රියාත්මක කිරීමක් පහත පරිදි වේ:

function* matchAll(str, regexp) {
  const flags = regexp.global ? regexp.flags : regexp.flags + "g";
  const re = new RegExp(regexp, flags);
  let match;
  while (match = re.exec(str)) {
    yield match;
  }
}

මුල් රීජෙක්ස් පිටපතක් සාදනු ලැබේ; මෙය විකෘති වීම හේතුවෙන් අතුරු ආබාධ වළක්වා ගැනීමයිlastIndex බහු තරඟ හරහා යන විට දේපල ගැනීමයි.

එසේම, අප විසින් රීජෙක්ස් සතුව ඇති බව සහතික කළ යුතුය ගෝලීය අසීමිත පුඩුවක් වළක්වා ධජය .

මෙම ස්ටැක් ඕවර්ෆ්ලෝ ප්‍රශ්නය පවා යෝජනාවේ සාකච්ඡාවලදී යොමු කර තිබීම ගැන මම සතුටු වෙමි .


114
+1 දෙවන උදාහරණයේ දී ඔබ RegExp වස්තුව ("/ myregexp /" පමණක් නොව) භාවිතා කළ යුතු බව කරුණාවෙන් සලකන්න. Regexp වස්තුව භාවිතා නොකර එය අසීමිත ලෙස පුනරාවර්තනය වේ
ianaz

7
ෂියානාස්: මම විශ්වාස කරන්නේ නැහැ ඒක ඇත්ත කියලා? http://jsfiddle.net/weEg9/ අවම වශයෙන් Chrome හි වැඩ කරන බව පෙනේ.
spinningarrow

17
ඉහත වෙනුවට කරන්නේ ඇයි: var match = myString.match(myRegexp); // alert(match[1])?
ජෝන් ඇලන්

29
පැහැදිලි "නව RegExp" අවශ්‍ය නොවේ, කෙසේ වෙතත් / g නියම කර නොමැති නම් අනන්ත පුඩුවක් සිදුවනු ඇත
ජෝර්ජ් සී

5
අනන්ත පුඩුවක් තුළට නොයැවිය හැකි තවත් ක්‍රමයක් නම්, නූල් පැහැදිලිව යාවත්කාලීන කිරීමයි, උදාstring = string.substring(match.index + match[0].length)
ඔල්ගා

186

සෑම තරඟයක් සඳහාම n වන කණ්ඩායම අල්ලා ගැනීම සඳහා ඔබට භාවිතා කළ හැකි ක්‍රමයක් මෙන්න :

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'something format_abc something format_def something format_ghi';
var myRegEx = /(?:^|\s)format_(.*?)(?:\s|$)/g;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 1);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);


12
මෙය අනෙක් අයට වඩා උසස් පිළිතුරකි, මන්ද එය එක් තරඟයක් පමණක් ලබා ගැනීම වෙනුවට සියලු තරඟ වලට වඩා නිවැරදිව ක්‍රියා කිරීම පෙන්නුම් කරයි.
රොබ් එවාන්ස්

13
mnn හරි. 'G' ධජය නොමැති නම් මෙය අසීමිත පුඩුවක් නිපදවනු ඇත. මෙම කාර්යය සමඟ ඉතා ප්‍රවේශම් වන්න.
ඩ්‍රස්කා

4
මම මෙය වැඩි දියුණු කළේ එය පයිතන්ගේ re.findall () ට සමාන කිරීමටයි. එය සියලු තරඟ අරා සමූහයකට කාණ්ඩ කරයි. එය ගෝලීය විකරණකාරක අනන්ත ලූප ගැටළුව ද විසඳයි. jsfiddle.net/ravishi/MbwpV
රවිෂි

5
@ මයිකල් මිකොව්ස්කි දැන් ඔබ ඔබේ අසීමිත ලූපය සඟවා ඇත, නමුත් ඔබේ කේතය මන්දගාමී වනු ඇත. කේත තර්ක කිරීම නරක ආකාරයකින් කිරීම වඩා හොඳ යැයි මම තර්ක කරමි, එවිට ඔබ එය සංවර්ධනයේදී අල්ලා ගනී. සමහර bs උපරිම පුනරාවර්තන බිඳ දැමීම අලස ය. ගැටළු වලට මූලික හේතුව විසඳීම වෙනුවට සැඟවීම පිළිතුර නොවේ.
වොලර්

4
Ic මයිකල් මිකොව්ස්කි ඔබ ක්‍රියාත්මක කිරීමේ සීමාවට නොපැමිණෙන විට එය මන්දගාමී නොවේ. ඔබ සිටින විට, එය පැහැදිලිවම මන්දගාමී වේ. ඔබේ කේතය ක්‍රියාත්මක නොවන බව මම නොකියමි, ප්‍රායෝගිකව මම සිතන්නේ එය යහපතට වඩා හානියක් කරයි. කිසියම් කේත කැබැල්ලක් අනවශ්‍ය ලෙස ක්‍රියාත්මක කිරීම 10,000 ක් සිදු කළද, ඩිව් පරිසරයක වැඩ කරන පුද්ගලයින්ට කේතය කිසිදු බරක් නොමැතිව හොඳින් ක්‍රියාත්මක වන බව පෙනෙනු ඇත. එවිට ඔවුන් එය නිෂ්පාදන පරිසරයකට තල්ලු කර ඔවුන්ගේ යෙදුම බර අඩු වන්නේ මන්දැයි කල්පනා කරයි. මගේ අත්දැකීම් අනුව, දේවල් පැහැදිලි ආකාරයකින් කැඩී ගියහොත් සහ ඊට පෙර සංවර්ධන චක්‍රයේ දී වඩා හොඳය.
වොලර්

59

var myString = "something format_abc";
var arr = myString.match(/\bformat_(.*?)\b/);
console.log(arr[0] + " " + arr[1]);

මෙම \bහරියටම සමාන නොවේ. (එය ක්‍රියාත්මක වේ --format_foo/, නමුත් ක්‍රියාත්මක නොවේ format_a_b) නමුත් මට අවශ්‍ය වූයේ ඔබේ ප්‍රකාශනයට විකල්පයක් පෙන්වීමටය, එය හොඳයි. ඇත්ත වශයෙන්ම, matchඇමතුම වැදගත් දෙයයි.


2
එය හරියටම ආපසු හැරවීමකි. '\ b' වචන සීමා කරයි. word = '\ w' = [a-zA-Z0-9_]. "format_a_b" යනු වචනයකි.
බීඑෆ්

1
@BF අවංකවම, මම format_a_bමීට වසර 6 කට පෙර සිතුවිල්ලක් ලෙස "ක්‍රියා නොකරයි ", සහ මා එහි අදහස් කළ දේ මට මතක නැත ... :-) එහි අර්ථය "අල්ලා ගැනීමට aපමණක් ක්‍රියා නොකරයි ", එනම්. පළමු අකාරාදී කොටස format_.
ෆිල්හෝ

1
මට කියන්නට අවශ්‍ය වූයේ \ b (- format_foo /} \ b "--format_foo /" ආපසු නොඑන නිසා "-" සහ "/" \ වචන අක්ෂර නොවන නිසාය. නමුත් \ b (format_a_b) return b ආපසු "format_a_b "හරිද? මම ඔබේ පෙළ ප්‍රකාශය වටකුරු වරහන් වල සඳහන් කරමි. (ඡන්දය ප්‍රකාශ නොකළේය!)
බීඑෆ්

32

ඉහත බහු-ගැලපුම් වරහන් උදාහරණ සම්බන්ධයෙන්, මට අවශ්‍ය දේ ලබා නොගත් පසු මම මෙහි පිළිතුරක් සොයමින් සිටියෙමි:

var matches = mystring.match(/(?:neededToMatchButNotWantedInResult)(matchWanted)/igm);

ඉහත සහ .පුෂ් () සමඟ තරමක් කැටි ගැසුණු ශ්‍රිත ඇමතුම් දෙස බැලීමෙන් පසුව, ගැටලුව mystring.replace () සමඟ ඉතා අලංකාර ලෙස විසඳා ගත හැකි බව මට වැටහුණි (ප්‍රතිස්ථාපනය කාරණය නොවේ, එය පවා සිදු නොවේ , CLEAN, දෙවන පරාමිතිය සඳහා පුනරාවර්තන ශ්‍රිත ඇමතුම් විකල්පය!):

var yourstring = 'something format_abc something format_def something format_ghi';

var matches = [];
yourstring.replace(/format_([^\s]+)/igm, function(m, p1){ matches.push(p1); } );

මෙයින් පසු, මම නැවත කිසිදෙයක් සඳහා .match () භාවිතා කරනු ඇතැයි මම නොසිතමි.


29

අවසාන වශයෙන් නොව, මට හොඳින් ගැලපෙන එක් කේත පේළියක් මට හමු විය (JS ES6):

let reg = /#([\S]+)/igm; // Get hashtags.
let string = 'mi alegría es total! ✌🙌\n#fiestasdefindeaño #PadreHijo #buenosmomentos #france #paris';

let matches = (string.match(reg) || []).map(e => e.replace(reg, '$1'));
console.log(matches);

මෙය නැවත පැමිණේ:

['fiestasdefindeaño', 'PadreHijo', 'buenosmomentos', 'france', 'paris']

1
බූම්! බව ය මෙහි බොහෝ අලංකාර විසඳුමක්. replaceඇලෙක්ස්ගේ පූර්ණ ප්‍රවේශයට වඩා මෙය මට හොඳ බව මට පෙනී ගියේය. මේ පිළිබඳ හොඳ රැකියාවක්, සෙබස්තියන් එච්.
කෝඩි

මෙය ඉතා හොඳින් ක්‍රියාත්මක වන අතර එය නියත වශයෙන්ම මගේ ප්‍රයෝජනය කරා ගමන් කරයි :)
කෝඩි

20

String#matchAll(බලන්න අදියර 3 කෙටුම්පත් / දෙසැම්බර් 7, 2018 යෝජනාව ), තරගයේ වස්තුව (මනස සමූහ 0 තවදුරටත් කණ්ඩායම් රටාව තුළ අත්පත්කරගැනීම කණ්ඩායම් අනුරූප වන අතර, මුළු තරගය බව) සියලු කන්ඩායම් කිරීමට acccess සරළ:

සමග matchAllලබා ගත හැකි, ඔබ මඟහරවා ගත හැකිය whileපුඩුවක් හා execසමග /g... ඒ වෙනුවට, භාවිතා matchAll, ඔබ නැවත ඔබ වඩාත් පහසු සමග භාවිතා කළ හැකි වන ලෙස iterator ලබා for...of, අරාව පැතිර , හෝ Array.from()නිර්මාණය කරන

මෙම ක්‍රමය Regex.MatchesC #, re.finditerපයිතන්, preg_match_allPHP හි සමාන ප්‍රතිදානයක් ලබා දෙයි .

JS නිරූපණයක් බලන්න (ගූගල් ක්‍රෝම් 73.0.3683.67 (නිල ගොඩනැගීම), බීටා (64-බිට්) පරීක්ෂා කර ඇත):

var myString = "key1:value1, key2-value2!!@key3=value3";
var matches = myString.matchAll(/(\w+)[:=-](\w+)/g);
console.log([...matches]); // All match with capturing group values

මෙම console.log([...matches])දර්ශන

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

ඔබට ගැලපීම් අගය හෝ විශේෂිත කණ්ඩායම් අගයන් භාවිතා කළ හැකිය

let matchData = "key1:value1, key2-value2!!@key3=value3".matchAll(/(\w+)[:=-](\w+)/g)
var matches = [...matchData]; // Note matchAll result is not re-iterable

console.log(Array.from(matches, m => m[0])); // All match (Group 0) values
// => [ "key1:value1", "key2-value2", "key3=value3" ]
console.log(Array.from(matches, m => m[1])); // All match (Group 1) values
// => [ "key1", "key2", "key3" ]

සටහන : බ්‍රව්සරයේ අනුකූලතා විස්තර බලන්න.


යතුරු අගය යුගල සඳහා පරිපූර්ණ උදාහරණය. සංක්ෂිප්ත හා කියවීමට පහසු, භාවිතා කිරීමට ඉතා සරල ය. එසේම, වඩා හොඳ දෝෂ හැසිරවීම, පැතිරීම ශුන්‍යයට වඩා හිස් අරාවක් ලබා දෙනු ඇත, එබැවින් තවත් 'දෝෂයක් නැත, දේපල "දිග" ශුන්‍ය නොවේ "
ජැරොඩ් මැක්ගුවර්

19

මෙම පිළිතුර සඳහා භාවිතා වන පාරිභාෂිතය:

  • තරඟය මඟින් ඔබේ රෙජෙක්ස් රටාව ඔබේ නූලට එරෙහිව ධාවනය කිරීමේ ප්‍රති result ලය පෙන්නුම් කරයි : someString.match(regexPattern).
  • ගැලපෙන රටාවන් ඇතුළත සියලු බලකායේ ආදාන නූල්, සියලු ගැලපෙන කොටස් බවයි තරගය සාධක විය. මේ සියල්ල ආදාන නූල තුළ ඔබේ රටාවේ අවස්ථා වේ.
  • ගැලපෙන කණ්ඩායම් විසින් රෙජෙක්ස් රටාවෙන් අර්ථ දක්වා ඇති සියලුම කණ්ඩායම් අල්ලා ගැනීමට දක්වයි. (වරහන් තුළ ඇති රටා, එසේ ය : /format_(.*?)/g, (.*?)ගැලපෙන කණ්ඩායමක් වන්නේ කොතැනද ?) මේවා වාසය කරන්නේ ගැළපෙන රටා තුළ ය .

විස්තර

ගැළපෙන කණ්ඩායම් වෙත ප්‍රවේශය ලබා ගැනීම සඳහා, ගැලපෙන එක් එක් රටාවන් තුළ , ඔබට ශ්‍රිතයක් හෝ තරගය පුරා පුනරාවර්තනයට සමාන යමක් අවශ්‍ය වේ. අනෙක් පිළිතුරු බොහොමයක් පෙන්වන පරිදි ඔබට මෙය කළ හැකි ක්‍රම ගණනාවක් තිබේ. අනෙකුත් බොහෝ පිළිතුරු ගැලපෙන සියලු රටාවන් නැවත සැකසීමට කාල පුඩුවක් භාවිතා කරයි , නමුත් මම හිතන්නේ අපි සියලු දෙනා එම ප්‍රවේශය සමඟ ඇති විය හැකි අන්තරායන් දනිමු. new RegExp()විවරණයක පමණක් සඳහන් කර ඇති රටාව වෙනුවට ආදේශ කිරීම අවශ්‍ය වේ . මෙයට හේතුව මෙම .exec()ක්‍රමය උත්පාදක ශ්‍රිතයකට සමාන ලෙස ක්‍රියා කරන බැවිනි - එය ගැලපීමක් ඇති සෑම අවස්ථාවකම එය නතර කරයි , නමුත් .lastIndexඊළඟ .exec()ඇමතුම මත එය එතැනින් ඉදිරියට ගෙන යයි.

කේත උදාහරණ

පහත ශ්රිතයක උදාහරණයක් searchStringලෙස නැවත වන Arrayසියලු ගැලපෙන රටාවන් එක් එක් ස්ථාන, matchයනු Arrayසියලු අඩංගු සමග ගැලපෙන කණ්ඩායම් . ටික වේලාවක් භාවිතා කරනවා වෙනුවට, මම Array.prototype.map()ක්‍රියාකාරීත්වය මෙන්ම වඩාත් ක්‍රියාකාරී ක්‍රමයක් භාවිතා කරමින් උදාහරණ ලබා දී ඇත - තැනිතලාවක් භාවිතා කිරීමfor ලූප් .

සංක්ෂිප්ත අනුවාදයන් (අඩු කේතය, වැඩි සින්ටැක්ටික් සීනි)

මූලික වශයෙන් forEachවේගවත්- forලූප් වෙනුවට-ලූප් ක්‍රියාත්මක කරන බැවින් මේවා අඩු ක්‍රියාකාරී වේ.

// Concise ES6/ES2015 syntax
const searchString = 
    (string, pattern) => 
        string
        .match(new RegExp(pattern.source, pattern.flags))
        .map(match => 
            new RegExp(pattern.source, pattern.flags)
            .exec(match));

// Or if you will, with ES5 syntax
function searchString(string, pattern) {
    return string
        .match(new RegExp(pattern.source, pattern.flags))
        .map(match =>
            new RegExp(pattern.source, pattern.flags)
            .exec(match));
}

let string = "something format_abc",
    pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;

let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag

ක්‍රියාකාරී අනුවාදයන් (වැඩි කේතයක්, අඩු සින්ටැක්ටික් සීනි)

// Performant ES6/ES2015 syntax
const searchString = (string, pattern) => {
    let result = [];

    const matches = string.match(new RegExp(pattern.source, pattern.flags));

    for (let i = 0; i < matches.length; i++) {
        result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
    }

    return result;
};

// Same thing, but with ES5 syntax
function searchString(string, pattern) {
    var result = [];

    var matches = string.match(new RegExp(pattern.source, pattern.flags));

    for (var i = 0; i < matches.length; i++) {
        result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
    }

    return result;
}

let string = "something format_abc",
    pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;

let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag

මෙම විකල්පයන් වෙනත් පිළිතුරු වල කලින් සඳහන් කළ ඒවා සමඟ සැසඳිය යුතු නැත, නමුත් මෙම ප්‍රවේශය අනෙක් කාර්ය සාධනයට වඩා අඩු කාර්ය සාධනයක් සහ අඩු අසාර්ථක-ආරක්ෂිත යැයි මම සැක කරමි.


17

ඔබේ වාක්‍ය ඛණ්ඩය තබා ගැනීමට හොඳම නොවේ. FF / Gecko විසින් RegExp අර්ථ දක්වන්නේ ක්‍රියාකාරීත්වයේ දිගුවක් ලෙස ය.
(FF2 දුර ගොස් ඇත typeof(/pattern/) == 'function')

මෙය එෆ්එෆ් - අයිඊ, ඔපෙරා සහ ක්‍රෝම් සඳහා විශේෂිත බව පෙනේ.

ඒ වෙනුවට, වෙනත් අය කලින් සඳහන් කළ ක්‍රමයක් භාවිතා කරන්න: RegExp#execහෝ String#match.
ඔවුන් එකම ප්‍රති results ල ලබා දෙයි:

var regex = /(?:^|\s)format_(.*?)(?:\s|$)/;
var input = "something format_abc";

regex(input);        //=> [" format_abc", "abc"]
regex.exec(input);   //=> [" format_abc", "abc"]
input.match(regex);  //=> [" format_abc", "abc"]

16

execක්රමවේදය ඉල්ලා සිටීමට අවශ්ය නැත ! ඔබට කෙලින්ම "ගැලපීම" ක්‍රමය භාවිතා කළ හැකිය. වරහන් වර්‍ග අමතක නොකරන්න.

var str = "This is cool";
var matches = str.match(/(This is)( cool)$/);
console.log( JSON.stringify(matches) ); // will print ["This is cool","This is"," cool"] or something like that...

0 වන ස්ථානයට සියලු ප්‍රති .ල සහිත නූලක් ඇත. 1 වන ස්ථානය වරහන් මඟින් නිරූපණය කරන පළමු තරගය වන අතර දෙවන ස්ථානය ඔබේ වරහන් තුළ හුදකලා වී ඇත. කැදැලි වරහන් ඉතා ව්‍යාකූල බැවින් පරිස්සම් වන්න!


4
ගෝලීය ධජය නොමැතිව මෙය සියලු තරඟ නැවත ලබා දෙයි, ඒ සමඟ, ඔබට ලැබෙන්නේ එක් විශාල එකක් පමණි, එබැවින් ඒ ගැන විමසිල්ලෙන් සිටින්න.
ෂැඩිමිල්ක්මන් 01

8

ප්‍රායෝගික වන්නේ එක් ලයිනර් එකක් ඔබට වරහන් යුගලයක් තිබේ නම් පමණි:

while ( ( match = myRegex.exec( myStr ) ) && matches.push( match[1] ) ) {};

4
ඇයි නැත්තේwhile (match = myRegex.exec(myStr)) matches.push(match[1])
විල්මා

7

ඔබේ කේතය භාවිතා කිරීම:

console.log(arr[1]);  // prints: abc
console.log(arr[0]);  // prints:  format_abc

සංස්කරණය කරන්න: සෆාරි 3, එය වැදගත් නම්.


7

Es2018 සමඟ ඔබට දැන් String.match()නම් කරන ලද කණ්ඩායම් සමඟ කළ හැකිය , එය කිරීමට උත්සාහ කළ දෙය පිළිබඳව ඔබේ රීජෙක්ස් වඩාත් පැහැදිලි කරයි.

const url =
  '/programming/432493/how-do-you-access-the-matched-groups-in-a-javascript-regular-expression?some=parameter';
const regex = /(?<protocol>https?):\/\/(?<hostname>[\w-\.]*)\/(?<pathname>[\w-\./]+)\??(?<querystring>.*?)?$/;
const { groups: segments } = url.match(regex);
console.log(segments);

ඔබට එවැනි දෙයක් ලැබෙනු ඇත

{ප්‍රොටෝකෝලය: "https", ධාරක නාමය: "stackoverflow.com", pathname: "ප්‍රශ්න / 432493 / කෙසේද-ඔබ-පිවිසෙන්නේ-ගැලපෙන-කණ්ඩායම්-තුළ-ජාවාස්ක්‍රිප්ට්-නිත්‍ය-ප්‍රකාශනය", විමසුම්: " some = පරාමිතිය "}


6

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'Rs.200 is Debited to A/c ...2031 on 02-12-14 20:05:49 (Clear Bal Rs.66248.77) AT ATM. TollFree 1800223344 18001024455 (6am-10pm)';
var myRegEx = /clear bal.+?(\d+\.?\d{2})/gi;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 1);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);

function getMatches(string, regex, index) {
  index || (index = 1); // default to the first capturing group
  var matches = [];
  var match;
  while (match = regex.exec(string)) {
    matches.push(match[index]);
  }
  return matches;
}


// Example :
var myString = 'something format_abc something format_def something format_ghi';
var myRegEx = /(?:^|\s)format_(.*?)(?:\s|$)/g;

// Get an array containing the first capturing group for every match
var matches = getMatches(myString, myRegEx, 1);

// Log results
document.write(matches.length + ' matches found: ' + JSON.stringify(matches))
console.log(matches);


3

රීජෙක්ස් විය යුතු යැයි මම ෆිලෝ සමඟ එකඟ වුවද ඔබගේ කේතය මා වෙනුවෙන් වැඩ කරයි (මැක්හි FF3) :

/\bformat_(.*?)\b/

(නමුත්, ඇත්ත වශයෙන්ම, රීජෙක්ස් වල සන්දර්භය මා නොදන්නා නිසා මට විශ්වාස නැත.)


1
එය අවකාශයෙන් වෙන් වූ ලැයිස්තුවක් බැවින් මම සිතුවා හොඳයි. පුදුමයට කරුණක් නම් එම කේතය මා වෙනුවෙන් වැඩ නොකිරීමයි (FF3 Vista)
nickf

1
ඔව්, ඇත්තෙන්ම අමුතුයි. ඔබ එය ෆයර්බග් කොන්සෝලය තුළ තනිවම උත්සාහ කර තිබේද? වෙනත් ආකාරයකින් හිස් පිටුවකින් මා අදහස් කළේ.
PEZ

2
/*Regex function for extracting object from "window.location.search" string.
 */

var search = "?a=3&b=4&c=7"; // Example search string

var getSearchObj = function (searchString) {

    var match, key, value, obj = {};
    var pattern = /(\w+)=(\w+)/g;
    var search = searchString.substr(1); // Remove '?'

    while (match = pattern.exec(search)) {
        obj[match[0].split('=')[0]] = match[0].split('=')[1];
    }

    return obj;

};

console.log(getSearchObj(search));

2

බහුවිධ ගැලපීම් විග්‍රහ කිරීමට ඔබට සැබවින්ම පැහැදිලි ලූපයක් අවශ්‍ය නොවේ - විස්තර කර ඇති පරිදි ප්‍රතිස්ථාපන ශ්‍රිතයක් දෙවන තර්කය ලෙස සම්මත කරන්න String.prototype.replace(regex, func):

var str = "Our chief weapon is {1}, {0} and {2}!"; 
var params= ['surprise', 'fear', 'ruthless efficiency'];
var patt = /{([^}]+)}/g;

str=str.replace(patt, function(m0, m1, position){return params[parseInt(m1)];});

document.write(str);

මෙම m0තර්කය සම්පූර්ණ ගැලපෙන substring නියෝජනය {0}, {1}ආදිය, m1පළමු සංසන්දන කණ්ඩායමක් වන regex අල්ලු බහා එනම් කොටසක් නියෝජනය 0පළමු තරගය සඳහා. හා positionමෙම නඩුවේ භාවිතා නොකරන - ගැලපෙන කණ්ඩායමක් සොයාගනු ලැබූ වැල තුළ ආරම්භ දර්ශකයකි.


1

අපට ගැලපෙන කණ්ඩායමට නිත්‍ය ප්‍රකාශන වලින් බැක්ස්ලෑෂ් භාවිතා කර ගැලපෙන කණ්ඩායමේ අංකය භාවිතා කළ හැකිය:

/([a-z])\1/

Group 1 කේතයෙන් පළමු කණ්ඩායම ([az]) හා ගැලපේ


1

එක් පේළියේ විසඳුම:

const matches = (text,regex) => [...text.matchAll(regex)].map(([match])=>match)

එබැවින් ඔබට මේ ආකාරයෙන් භාවිතා කළ හැකිය (භාවිතා කළ යුත්තේ / g):

matches("something format_abc", /(?:^|\s)format_(.*?)(?:\s|$)/g)

ප්‍රති result ලය:

[" format_abc"]


0

මම ඔබ හා සමාන වන අතර රීජෙක්ස් විසින් මෙවැනි වස්තුවක් නැවත ලබා දෙනු ඇතැයි ප්‍රාර්ථනා කරමි:

{
    match: '...',
    matchAtIndex: 0,
    capturedGroups: [ '...', '...' ]
}

ඉන්පසු ශ්‍රිතය පහතින් ගිල දමන්න

/**
 * @param {string | number} input
 *          The input string to match
 * @param {regex | string}  expression
 *          Regular expression 
 * @param {string} flags
 *          Optional Flags
 * 
 * @returns {array}
 * [{
    match: '...',
    matchAtIndex: 0,
    capturedGroups: [ '...', '...' ]
  }]     
 */
function regexMatch(input, expression, flags = "g") {
  let regex = expression instanceof RegExp ? expression : new RegExp(expression, flags)
  let matches = input.matchAll(regex)
  matches = [...matches]
  return matches.map(item => {
    return {
      match: item[0],
      matchAtIndex: item.index,
      capturedGroups: item.length > 1 ? item.slice(1) : undefined
    }
  })
}

let input = "key1:value1, key2:value2 "
let regex = /(\w+):(\w+)/g

let matches = regexMatch(input, regex)

console.log(matches)


0

RegExp භාවිතා කරන්න $ 1 ... group n කාණ්ඩය උදා:

1. 1 වන කාණ්ඩයට ගැලපීම සඳහා RegExp. 1

  1. දෙවන කාණ්ඩයට ගැලපීම සඳහා RegExp. 2

ඔබ regex likey හි 3 කාණ්ඩයක් භාවිතා කරන්නේ නම් (string.match (regex) පසු සටහන භාවිතා කරන්න)

RegExp. Reg 1 RegExp. Reg 2 RegExp. $ 3

 var str = "The rain in ${india} stays safe"; 
  var res = str.match(/\${(.*?)\}/ig);
  //i used only one group in above example so RegExp.$1
console.log(RegExp.$1)

//easiest way is use RegExp.$1 1st group in regex and 2nd grounp like
 //RegExp.$2 if exist use after match

var regex=/\${(.*?)\}/ig;
var str = "The rain in ${SPAIN} stays ${mainly} in the plain"; 
  var res = str.match(regex);
for (const match of res) {
  var res = match.match(regex);
  console.log(match);
  console.log(RegExp.$1)
 
}

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.