Reguliere expressies – Match alles

Hoe maak ik een uitdrukking die met alles overeenkomt (inclusief spaties)?
Voorbeeld:

Regex:ik heb _____ schapen gekocht.

Wedstrijden:ik heb schapen gekocht. Ik heb een schaap gekocht. Ik heb vijf schapen gekocht.

Ik heb geprobeerd (.*)te gebruiken, maar dat lijkt niet te werken.


Antwoord 1, autoriteit 100%

Normaal gesproken komt de punt overeen met elk teken behalve nieuwe regels.

Dus als .*niet werkt, stel dan de “punt komt ook overeen met nieuwe regels” in (of gebruik (?s).*).

Als je JavaScript gebruikt, dat geen “dotall”-optie heeft, probeer dan [\s\S]*. Dit betekent “kom overeen met een willekeurig aantal tekens dat witruimte of niet-witruimte is” – in feite “kom overeen met elke tekenreeks”.

Een andere optie die alleen werkt voor JavaScript (en niet wordt herkend door een andere regex-smaak) is [^]*die ook overeenkomt met een willekeurige tekenreeks. Maar [\s\S]*lijkt op grotere schaal te worden gebruikt, misschien omdat het draagbaarder is.


Antwoord 2, autoriteit 59%

(.*?)komt overal overeen – ik gebruik het al jaren.


Antwoord 3, autoriteit 30%

Kies & onthoud 1 van de volgende!!! 🙂

[\s\S]*
[\w\W]*
[\d\D]*

Uitleg:

\s: witruimte \s: geen witruimte

\W: woord \W: niet woord

\D: cijfer \D: geen cijfer

(Je kunt de *omwisselen voor +als je 1 of MEER tekens wilt [in plaats van 0 of meer]).

BONUS-BEWERKING:

Als je alles op één regel wilt matchen, kun je dit gebruiken:

[^\n]+

Uitleg:

^: niet

\n: regeleinde

+: voor 1 teken of meer


Antwoord 4, autoriteit 7%

Probeer dit:

I bought (.* )?sheep

of zelfs

I bought .*sheep

Antwoord 5, autoriteit 3%

Omdat .Zoek een enkel teken, behalve nieuwe regel of regel terminator.

Dus, om alles te matchen, kun je dit als volgt gebruiken: (.|\n)*?

Hopelijk helpt het!


Antwoord 6, autoriteit 2%

Gebruik .*en zorg ervoor dat u het equivalent van één regel voor uw implementaties gebruikt, zodat u matcht op regeleinden.

Er is hier een goede uitleg -> http://www.regular-expressions.info/dot.html


Antwoord 7, autoriteit 2%

/.*/werkt prima als er geen regeleinden zijn. Als het moet overeenkomen met regeleinden, zijn hier enkele oplossingen:

Oplossing Beschrijving
/.*/s /s(dot all flag) zorgt ervoor dat .(jokerteken) met alles overeenkomt, inclusief regeleinden. Gooi een *(sterretje) in en het komt overeen met alles. Meer lezen.
/[\s\S]*/ \s(metateken witruimte) komt overeen met elk witruimteteken (spatie; tab; regeleinde; …), en \s(tegenover \s) komt overeen met alles dat geeneen spatieteken is. *(sterretje) komt overeen met alle exemplaren van de tekenset (ingekapseld door []). Meer lezen.

Antwoord 8

(.*?)werkt niet voor mij. Ik probeer opmerkingen te matchen tussen /* */, die meerdere regels kunnen bevatten.

Probeer dit:

([a]|[^a])

Deze regex komt overeen met aof anything else expect a. Absoluut, het betekent dat je alles moet matchen.

BTW, in mijn situatie, /\*([a]|[^a])*/komt overeen met opmerkingen in C-stijl.

Bedank @mpen voor een meer beknopte manier.

[\s\S]

Antwoord 9

Als je JavaScript gebruikt, heeft ES2018 de vlag /s(dotAll) toegevoegd. Met de vlag /skomt de punt .overeen met elk teken, inclusief een nieuwe regel.

console.log("line_1\nline_2".match(/.+/s))

Antwoord 10

De specificatie van 2018 biedt de vlag van s (alias: dotAll), zodat .overeenkomt met elk teken, inclusief regeleinden:

const regExAll = /.*/s; //notice the 's'
let str = `
Everything
    in  this
            string
                    will
                        be
    matched. Including whitespace (even Linebreaks).
`;
console.log(`Match:`, regExAll.test(str)); //true
console.log(`Index Location:`, str.search(regExAll));
let newStr = str.replace(regExAll,"??");
console.log(`Replaced with:`,newStr); //Index: 0

Antwoord 11

  1. Regex:

    /I bought.*sheep./
    

    Komt overeen – de heletekenreeks tot het einde van de regel

    I bought sheep. I bought a sheep. I bought five sheep.

  2. Regex:

    /I bought(.*)sheep./
    

    Komt overeen – de heletekenreeks en leg ook de subtekenreeksvast binnen () voor verder gebruik

    I bought sheep. I bought a sheep. I bought five sheep.

    Ik hebsheep. I bought a sheep. I bought fiveschapen gekocht.

    Voorbeeld met Javascript/Regex

    'I bought sheep. I bought a sheep. I bought five sheep.'.match(/I bought(.*)sheep./)[0];
    

    Uitvoer:

    “Ik heb schapen gekocht. Ik heb een schaap gekocht. Ik heb vijf schapen gekocht.”

    'I bought sheep. I bought a sheep. I bought five sheep.'.match(/I bought(.*)sheep./)[1];
    

    Uitvoer:

    ” schaap. Ik heb een schaap gekocht. Ik heb er vijf gekocht “


Antwoord 12

Voor JavaScript lijkt het beste en eenvoudigste antwoord /.\*/te zijn.

Zoals door anderen gesuggereerd zou /(.*?)/ook werken, maar /.\*/is eenvoudiger. De ()in het patroon zijn niet nodig, voor zover ik kan zien, noch het einde ?om absoluut met alles overeen te komen (inclusief lege tekenreeksen)


NIET-OPLOSSINGEN:

  • /[\s\S]/komt NIET overeen met lege tekenreeksen, dus het is niet de oplossing.

  • /[\s\S]\*/komt WEL overeen met lege tekenreeksen. Maar het heeft een probleem: als je het in je code gebruikt, kun je geen commentaar geven op dergelijke code omdat de */wordt geïnterpreteerd als het einde van de reactie.

/([\s\S]\*)/werkt en heeft geen commentaarprobleem. Maar het is langer en ingewikkelder om te begrijpen dan /.*/.


Antwoord 13

<?php
$str = "I bought _ sheep";
preg_match("/I bought (.*?) sheep", $str, $match);
print_r($match);
?>

http://sandbox.phpcode.eu/g/b2243.php


Antwoord 14

Ik raad aan om /(?=.*...)/g

. te gebruiken

Voorbeeld

const text1 = 'I am using regex';
/(?=.*regex)/g.test(text1) // true
const text2 = 'regex is awesome';
/(?=.*regex)/g.test(text2) // true
const text3 = 'regex is util';
/(?=.*util)(?=.*regex)/g.test(text3) // true
const text4 = 'util is necessary';
/(?=.*util)(?=.*regex)/g.test(text4) // false because need regex in text

Gebruik regex101 om te testen


Antwoord 15

Eerlijk gezegd zijn veel van de antwoorden oud, dus ik ontdekte dat als je gewoon een willekeurige tekenreeks test, ongeacht de tekeninhoud met “/.*/i”, ALLES voldoende zal zijn.


Antwoord 16

Ik gebruik dit: (.|\n)+ werkt als een tierelier voor mij!

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes