I have the following line of code:
let regexp: RegExp = new RegExp('(?=\\s(.+))');
(
this is a test (
is a test (
test
for(
The (?=\\s(.+))
regex matches an empty location (because the whole pattern presents a positive lookahead, a zero-width assertion consuming no characters) that is followed with 1 whitespace and 1+ any characters other than a newline (that are captured into Group 1). Thus, it may match more than one word.
You can use
\S+(?=\s+\()
or
\w+(?=\s*\()
See the regex demo
Pattern explanation:
\w+
- 1 or more word chars (or 1+ non-whitespace chars if \S+
is used)....(?=\s*\()
- before 0+ whitespaces (\s*
) followed with a literal (
char (or before 1+ whitespaces followed with a (
if (?=\s+\()
is used).var re = /\w+(?=\s*\()/;
var str = 'this is a test (';
var res = (m = str.match(re)) ? m : "";
console.log(res[0]);
Alternative: Capturing Groups
You can achieve the same without any lookarounds. I like lookaheads since they are not that costly in most cases and the match structure is cleaner (you just have a single group equal to the whole match), but in this scenario, a mere capturing mechanism can be leveraged with
/(\w+)\s*\(/
where the value we need is captured with (\w+)
, a parenthesized part of the pattern. See the regex demo
var re = /(\w+)\s*\(/;
var str = 'this is a test (';
var res = (m = str.match(re)) ? m[1] : "";
console.log(res);