AMcoder - javascript, python, java, html, php, sql

Javascript - Ինչպե՞ս կարող եմ կատարել այս լարային մանիպուլյացիա՝ օգտագործելով regex ավելի մաքուր/արդյունավետ:

Ես ունեմ հետևյալ տողը.

[SM_g]Սա[SM_h][SM_g][SM_h][SM_g]a[SM_h][SM_g]նախադասություն է։[SM_h][SM_l][SM_g]Ահա[SM_h][SM_g]է[SM_h][SM_g]մեկ այլ նախադասություն։ [SM_h][SM_g]նախադասություն։[SM_h][SM_1]

Եվ ես կարող եմ այդ տողը վերածել այս տողի, որն այնուհետև ցուցադրում եմ <p> տարրի մեջ.

Սա նախադասություն է.

Ահա ևս մեկ նախադասություն.

հետևյալ ծածկագրով.

tokenResponseText_initial = "[SM_g]This[SM_h][SM_g]is[SM_h][SM_g]a[SM_h][SM_g]sentence.[SM_h][SM_l][SM_g]Here[SM_h][SM_g]is[SM_h][SM_g]another[SM_h][SM_g]sentence.[SM_h][SM_1]"

const newLineIndicator = "insert-double-new-line"

const tokenResponseText_fixedNewLines = tokenResponseText_initial.replace(/(\[SM_g].*?)(\[SM_h]\[SM_l])/g, "$1" + newLineIndicator + "$2");

const wordCompilationRegex = /\[SM_g](.*?)\[SM_h]/g;
var wordRegexResponse;

var summary = "";

do {
  wordRegexResponse = wordCompilationRegex.exec(tokenResponseText_fixedNewLines);
  if (wordRegexResponse) {
    if (wordRegexResponse[1].includes(newLineIndicator)) {
      summary += wordRegexResponse[1].replace(newLineIndicator, "") + "\n\n";
    } else {
      summary += wordRegexResponse[1] + " ";
    }
  }
} while (wordRegexResponse);
//The following is rough code, 
someParagraphElement.innerHTML = summary;
p {
  white-space: pre-line;
}
<p id="someParagraphElement"></p>

Որտեղ պարբերության տարրն ունի հետևյալ հատկանիշը white-space: pre-line;

Այնուամենայնիվ, իդեալականորեն, երկու նախադասությունների միջև կրկնակի նոր գիծ ստեղծելու համար ես կցանկանայի վերացնել newLineIndicator-ի օգտագործումը և պարզապես անել սա.

Բայց այս երկրորդ մեթոդը չի աշխատում։ Վերջնական արդյունքը չի ավարտվում կրկնակի նոր տողերով չնայած, երբ ես տպում եմ tokenResponseText_fixedNewLines վահանակի վրա, թվում է, թե կրկնակի նոր տողերը տեղադրվել են, այսպես.

[SM_g]Սա[SM_h][SM_g][SM_h][SM_g]a[SM_h][SM_g]նախադասություն է:

[SM_h][SM_l][SM_g]Ահա[SM_h][SM_g]է[SM_h][SM_g]մեկ այլ[SM_h][SM_g]նախադասություն:[SM_h][SM_1]

tokenResponseText_initial = "[SM_g]This[SM_h][SM_g]is[SM_h][SM_g]a[SM_h][SM_g]sentence.[SM_h][SM_l][SM_g]Here[SM_h][SM_g]is[SM_h][SM_g]another[SM_h][SM_g]sentence.[SM_h][SM_1]"

const tokenResponseText_fixedNewLines = tokenResponseText_initial.replace(/(\[SM_g].*?)(\[SM_h]\[SM_l])/g, "$1\n\n$2");

const wordCompilationRegex = /\[SM_g](.*?)\[SM_h]/g;
var wordRegexResponse;

var summary = "";

do {
  wordRegexResponse = wordCompilationRegex.exec(tokenResponseText_fixedNewLines);
  if (wordRegexResponse) {
    summary += wordRegexResponse[1] + " ";

  }
} while (wordRegexResponse);
//The following is rough code, 
someParagraphElement.innerHTML = summary;
p {
  white-space: pre-line;
}
<p id="someParagraphElement"></p>

Ինչու՞ երկրորդ մեթոդը չի աշխատում, չնայած առաջին մեթոդն աշխատում է: .*?-ը չի՞ գրավում նոր տողեր:

18.04.2018

  • Բոլոր [SM_x]-ը պետք է փոխարինվեն մեկ բացատով, թե՞ որոշները փոխարինվեն այլ նիշերով: Կարո՞ղ եք օգնել նշել, թե այս կոդերից յուրաքանչյուրը ինչով պետք է փոխարինվի: 18.04.2018
  • [SM_x]-ն իրականում չի փոխարինվել, ավելի շուտ, ես օգտագործում եմ do/while կառուցվածքը, որպեսզի կազմեմ բոլոր բառերը յուրաքանչյուր [SM_x]-ի միջև մեկ տողի մեջ, ինչպես ցույց է տրված օրինակում: Երբ կա [SM_g]word[SM_h][SM_l], ռեգեքսը (երկրորդ օրինակում) այն վերածում է [SM_g]word\n\n[SM_h][SM_l]ի 18.04.2018

Պատասխանները:


1

Լռելյայնորեն, .-ը չի համապատասխանում նոր տողերին: Այսպիսով, երբ նոր տողերը տեղադրեք տողի մեջ առաջին .replace()-ով, [SM_g]word[SM_h] հաջորդականություններից մի քանիսն այլևս չեն համընկնում wordCompilationRegex-ի հետ:

Դուք կարող եք օգտագործել s փոփոխիչը՝ .-ին նոր տողերի համապատասխանությունը թույլ տալու համար:

Վայ Սա Chrome-ի ընդլայնում է, այլ ոչ թե Javascript ստանդարտ դրոշ: .-ի փոխարեն օգտագործեք [\s\S]:

tokenResponseText_initial = "[SM_g]This[SM_h][SM_g]is[SM_h][SM_g]a[SM_h][SM_g]sentence.[SM_h][SM_l][SM_g]Here[SM_h][SM_g]is[SM_h][SM_g]another[SM_h][SM_g]sentence.[SM_h][SM_1]"

const tokenResponseText_fixedNewLines = tokenResponseText_initial.replace(/(\[SM_g].*?)(\[SM_h]\[SM_l])/g, "$1\n\n$2");

const wordCompilationRegex = /\[SM_g]([\s\S]*?)\[SM_h]/g;
var wordRegexResponse;

var summary = "";

do {
  wordRegexResponse = wordCompilationRegex.exec(tokenResponseText_fixedNewLines);
  if (wordRegexResponse) {
    summary += wordRegexResponse[1] + " ";

  }
} while (wordRegexResponse);
//The following is rough code, 
someParagraphElement.innerHTML = summary;
p {
  white-space: pre-line;
}
<p id="someParagraphElement"></p>

18.04.2018
  • Պատասխանը գործարկելիս (առնվազն փաթեթի գերհոսքում) սխալ է հայտնվում՝ ասելով "SyntaxError: invalid regular expression flag s" 18.04.2018
  • Ինձ համար Chrome-ում լավ է աշխատում: 18.04.2018
  • Այ, հա, չհաջողվեց աշխատել firefox quantam-ում (բայց ես ստուգեցի ու քրոմում էր աշխատում): Ես չգիտեմ, թե արդյոք դա խնդիր կլինի, հաշվի առնելով, որ այս կոդը նախատեսված է վեբ ընդլայնման համար, որը պետք է աշխատի chrome-ում կամ firefox-ում: 18.04.2018
  • Ըստ երևույթին, s դրոշը ստանդարտ չէ, այն Chrome-ի ընդլայնում է: 18.04.2018
  • Օ,, դա խնդրահարույց է, գիտե՞ք դա անել առանց քրոմի հատուկ ընդլայնման եղանակների: 18.04.2018
  • Թարմացվել է պատասխանը։ .-ի փոխարեն օգտագործեք [\s\S]: 18.04.2018

  • 2

    Ձեր նոր կոդը նախադասությունների միջև նոր գիծ չի դնում, քանի որ ձեր ծածկագրում ոչինչ չկա, որը կարող է դա անել:

    Այն, ինչ դուք ցանկանում եք անել, 1) պարզել, թե արդյոք կա նոր նախադասություն: 2) Երբ կա նոր նախադասություն, տեղադրեք երկու նոր տող նրանց միջև:

    1. Նոր նախադասություն հայտնաբերելու համար օգտագործեք let index = summary.indexOf('.'), և եթե ինդեքսը --1 չէ և հավասար չէ summary.length - 1-ին (այսինքն՝ տողի վերջին նիշին), ապա դուք հայտնաբերել եք, որ կա առնվազն երկու նախադասություն։

    2. Եթե ​​նկատել եք, որ կա երկու նախադասություն, ապա դրանց միջև նոր տողերի տեղադրումը պարզ խնդիր է օգտագործելով array.splice():

    Նշում․ եթե ձեզ անհրաժեշտ է կարգավորել երկու նախադասություններից ավելին, ապա ես խորհուրդ կտամ գրել կոդը երկու նախադասություն մշակելու համար (ինչպես ես վերը նկարագրեցի) և այնուհետև այն փոփոխել՝ բոլոր ինդեքսների միջով անցնելու համար ինչպես բացատրում է այս հարցի առաջին պատասխանը:

    Եթե ​​դուք սկսեք գրել ձեր կոդը և խրվել եք/ավելի շատ հարցեր ունեք, պարզապես մեկնաբանեք այս պատասխանը, և ես կպատասխանեմ:

    18.04.2018
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..