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 a
of 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 /s
komt 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
-
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.
-
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 heb
sheep. I bought a sheep. I bought five
schapen 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!