How do I make an expression to match absolutely anything (including whitespaces)?
Example:
Regex: I bought _____ sheep.
Matches: I bought sheep. I bought a sheep. I bought five sheep.
I tried using (.*), but that doesn't seem to be working.
How do I make an expression to match absolutely anything (including whitespaces)?
Example:
Regex: I bought _____ sheep.
Matches: I bought sheep. I bought a sheep. I bought five sheep.
I tried using (.*), but that doesn't seem to be working.
Normally the dot matches any character except newlines.
So if .* isn't working, set the "dot matches newlines, too" option (or use (?s).*).
If you're using JavaScript, which doesn't have a "dotall" option, try [\s\S]*. This means "match any number of characters that are either whitespace or non-whitespace" - effectively "match any string".
Another option that only works for JavaScript (and is not recognized by any other regex flavor) is [^]* which also matches any string. But [\s\S]* seems to be more widely used, perhaps because it's more portable.
(.*?) matches anything - I've been using it for years.
Choose & memorize 1 of the following!!! :)
[\s\S]*
[\w\W]*
[\d\D]*
Explanation:
\s: whitespace \S: not whitespace
\w: word \W: not word
\d: digit \D: not digit
(You can exchange the * for + if you want 1 or MORE characters [instead of 0 or more]).
BONUS EDIT:
If you want to match everything on a single line, you can use this:
[^\n]+
Explanation:
^: not
\n: linebreak
+: for 1 character or more
/.*/ works great if there are no line breaks. If it has to match line breaks, here are some solutions:
| Solution | Description |
|---|---|
/.*/s |
/s (dot all flag) makes . (wildcard character) match anything, including line breaks. Throw in an * (asterisk), and it will match everything. Read more. |
/[\s\S]*/ |
\s (whitespace metacharacter) will match any whitespace character (space; tab; line break; ...), and \S (opposite of \s) will match anything that is not a whitespace character. * (asterisk) will match all occurrences of the character set (Encapsulated by []). Read more. |
Because . Find a single character, except newline or line terminator.
So, to match anything, You can use like this: (.|\n)*?
Hope it helps!
If you're using JavaScript, ES2018 added the /s (dotAll) flag. With the /s flag, the dot . will match any character, including a newline.
console.log("line_1\nline_2".match(/.+/s))
Note: It's not supported by all browsers yet.
Use .*, and make sure you are using your implementations' equivalent of single-line so you will match on line endings.
There is a great explanation here -> http://www.regular-expressions.info/dot.html
(.*?) does not work for me. I am trying to match comments surrounded by /* */, which may contain multiple lines.
Try this:
([a]|[^a])
This regex matches a or anything else expect a. Absolutely, it means matching everything.
BTW, in my situation, /\*([a]|[^a])*/ matches C style comments.
Thank @mpen for a more concise way.
[\s\S]
For JavaScript the best and simplest answer would seem to be /.\*/.
As suggested by others /(.*?)/ would work as well but /.\*/ is simpler. The () inside the pattern are not needed, as far as I can see nor the ending ? to match absolutely anything (including empty strings)
NON-SOLUTIONS:
/[\s\S]/ does NOT match empty strings so it's not the solution.
/[\s\S]\*/ DOES match also empty strings. But it has a problem: If you use it in your code then you can't comment out such code because the */ is interpreted as end-of-comment.
/([\s\S]\*)/ works and does not have the comment-problem. But it is longer and more complicated to understand than /.*/.
The 2018 specification provides the s flag (alias: dotAll), so that . will match any character, including linebreaks:
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
Regex:
/I bought.*sheep./
Matches - the whole string till the end of line
I bought sheep. I bought a sheep. I bought five sheep.
Regex:
/I bought(.*)sheep./
Matches - the whole string and also capture the sub string within () for further use
I bought sheep. I bought a sheep. I bought five sheep.
I boughtsheep. I bought a sheep. I bought fivesheep.
Example using Javascript/Regex
'I bought sheep. I bought a sheep. I bought five sheep.'.match(/I bought(.*)sheep./)[0];
Output:
"I bought sheep. I bought a sheep. I bought five sheep."
'I bought sheep. I bought a sheep. I bought five sheep.'.match(/I bought(.*)sheep./)[1];
Output:
" sheep. I bought a sheep. I bought five "
I recommend use /(?=.*...)/g
Example
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
Use regex101 to test
Honestly alot of the answers are old so i found that if you simply just test any string regardless of character content with "/.*/i" will sufficiently get EVERYTHING.
<?php
$str = "I bought _ sheep";
preg_match("/I bought (.*?) sheep", $str, $match);
print_r($match);
?>
One option is the empty regular expression, denoted in JavaScript as /(?:)/. (You can also use new RegExp()). Logically, an empty regular expression should match strings containing "emptiness" at any position--which of course is all of them.
See this SO question and this blog post for discussion and more details.
I use this: (.|\n)+ works like a charm for me!