JavaScript正则表达式

JavaScript正则表达式,javascript,regex,Javascript,Regex,我有这样一个字符串:02-09-10,20:19(1达根·盖莱登)。我需要括号里的1。我使用了这个正则表达式: myStr.replace(/(.+*)\([0-9]{1,})dagen geleden\)/i,$2') 但这不起作用。。。怎么办 请注意,dodo的(.+*)无效。您想要的是(.+?)。并使用.match或re.exec获取子字符串,而不是。replace 如果存在多个外观: var rx = /\((\d+) dagen geleden\)/g; var res = []; w

我有这样一个字符串:
02-09-10,20:19(1达根·盖莱登)
。我需要括号里的1。我使用了这个正则表达式:

myStr.replace(/(.+*)\([0-9]{1,})dagen geleden\)/i,$2')

但这不起作用。。。怎么办

请注意,dodo的
(.+*)
无效。您想要的是
(.+?)
。并使用
.match
re.exec
获取子字符串,而不是
。replace

如果存在多个外观:

var rx = /\((\d+) dagen geleden\)/g;
var res = [];
while((m = rx.exec(myStr))) {
  res.push(m[1]);
}
return res;
否则,只需使用:

var m = myStr.match(/\((\d+) dagen geleden\)/);
if (m)
  return m[1];
else {
  // not found.
}

+*
将消耗整个字符串,因为它是贪婪的,同时使用
+
*
也是错误的

var myStr = "02-09-10, 20:19 (1 dagen geleden)";
myStr.match(/([0-9]+) dagen geleden\)$/)[1]; // 1
找到它

var a = "02-09-10, 20:19 (1 dagen geleden)".match(/\(([0-9]+)/)
打电话

parseInt( a[1], 10)
如果要将1替换为2

"02-09-10, 20:19 (1 dagen geleden)".replace(/\(([0-9]+)/, '(2')

而且。。。1 dagen geleden在语法上是错误的;)

这是您第一次尝试正则表达式:

% js
Rhino 1.7 release 2 2009 03 22
js> var x = '02-09-10, 20:19 (1 dagen geleden)';
js> x.replace(/(.+*)\(([0-9]{1,}) dagen geleden\)/g, '$2');
js: uncaught JavaScript runtime exception: SyntaxError: Invalid quantifier *
正如有人已经提到的,你不想要那个星号。把它扔掉吧:

js> x.replace(/(.+)\(([0-9]{1,}) dagen geleden\)/g, '$2');
1
这是你想要的“1”

但你可以让它变得更好。为什么说“[0-9]{1,}”,而“\d+”的意思是一样的?还有,你确定在最后一个“)”之后再也不会有字符了吗?是否会有多余的空格,或者这些空格可能是其他类型的空格(可能是制表符)?如果你真的想在“dagen geleden”之前写下这个数字,我会这样写:

js> x =  x.match(/\((\d+)\s+dagen\s+geleden\)/)[1];
1
即使字符串中有意外的垃圾,它也会捕获该数字:

js> "garbage (255 dagen geleden) more garbage".match(/\((\d+)\s+dagen\s+geleden\)/)[1];
255

我不太清楚自己是如何回到这个问题上来的,但我决定进一步阐述我在前面的评论中提出的一点。您使用的是string.replace(),其中string.match()或regex.exec()更合适

此外,您甚至不需要使用正则表达式就可以实现目标,如果您对正则表达式不太熟悉,正则表达式应该更高效、更容易理解:

// The input string:
var myStr = "02-09-10, 20:19 (1 dagen geleden)";

// substring() would work just as well in place of slice() here:
alert(myStr.slice(
    // slice from the 1st character after the opening brace,
    myStr.indexOf("(")+1,
    // to the space just before "dagen"
    myStr.indexOf(" dagen")
));
// -> 1
事实上,您提出的正则表达式非常明确,您可以将slice的第一个参数更改为您知道的数字:

myStr.slice(17, myStr.indexOf(" dagen"));
// -> 1

另外,
+
{1,}
相同。好的,这很有效<代码>myStr.replace(/\d{2}-\d{2}-\d{2}、\d{2}:\d{2}\([0-9]+)dagen geleden\)$/,“$1”)@dodo:使用replace从字符串中提取某些内容是不明智的,因为您使用的方式与提供match()和exec()的方式完全相同。KennyTM和adamse都提供了合适的、更具可读性的解决方案,实现了相同的目标。@Andy:为什么使用替换不明智?@dodo:这样使用不明智,因为没有任何意义。有时,替换对于解析字符串(而不是实际替换任何内容)非常有用,但您的正则表达式非常明确,您最好使用substring()和indexOf()来代替。就像我说的,看看KennyTM和adamse的答案,他们的想法是一样的,但方式更为正确。字符串的格式将始终与我说的相同。。。我要试试火柴!!谢谢没想到这个!!它确实总是按照我说的格式,所以,这会更快!