正则表达式提取子字符串,由于某种原因返回2个结果

Ric*_*ick 54 javascript regex substring

我需要在javascript中做很多正则表达式的东西,但是我遇到了一些语法问题,而且我似乎无法在此找到一个明确的资源...出于某种原因我做的时候:

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test)
Run Code Online (Sandbox Code Playgroud)

表明

"afskfsd33j, fskfsd33"
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它给出原始和匹配字符串的输出,我想知道我怎么能得到它只是给匹配(基本上从原始字符串中提取我想要的部分)

谢谢你的建议

Jac*_*kin 93

match 返回一个数组.

JavaScript中数组的默认字符串表示形式是以逗号分隔的数组元素.在这种情况下,所需的结果是在数组的第二个元素中:

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test[1]);
Run Code Online (Sandbox Code Playgroud)

  • @约翰·李这是因为原来的字符串正则表达式`/一个(.*)焦耳/`和阵列的所述第二项包含第一匹配组`匹配(.*)`.此外,组(0)始终是整个匹配,而组(n)是由括号标记的第n组.我希望这是可以理解的,如果不尝试[此文档的详细信息.](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/match) (7认同)
  • 我听起来可能很笨,但是为什么match返回原始字符串?是否有任何文档? (2认同)

Mah*_*ian 8

只要去掉括号,就会得到一个只有一个元素的数组:

  • 改变这一行

    var test = tesst.match(/a(.*)j/);

  • 对此

    var test = tesst.match(/a.*j/);

如果添加括号,则 match() 函数将为您找到两个匹配项,一个用于整个表达式,一个用于括号内的表达式

  • 另根据developer.mozilla.org 文档:

如果您只想找到第一个匹配项,则可能需要使用 RegExp.exec()

您可以使用以下代码:

RegExp(/a.*j/).exec("afskfsd33j")
Run Code Online (Sandbox Code Playgroud)


Jan*_*cek 6

括号 () 定义的每个组在处理过程中被捕获,每个捕获的组内容按与模式中的组开始的顺序相同的顺序推送到结果数组中。在http://www.regular-expressions.info/brackets.htmlhttp://www.regular-expressions.info/refcapture.html上查看更多信息(选择正确的语言以查看支持的功能)

var source = "afskfsd33j"
var result = source.match(/a(.*)j/);

result: ["afskfsd33j", "fskfsd33"]
Run Code Online (Sandbox Code Playgroud)

您收到此确切结果的原因如下:

数组中的第一个值是第一个找到的字符串,它确认了整个模式。因此,它绝对应该以“a”开头,后跟任意数量的任何字符,并以“a”开头后的第一个“j”字符结尾。

数组中的第二个值是由括号定义的捕获组。在您的案例组中包含完整的模式匹配,而没有在括号外定义的内容,所以正好是“fskfsd33”。

如果你想摆脱数组中的第二个值,你可以像这样定义模式:

/a(?:.*)j/
Run Code Online (Sandbox Code Playgroud)

其中“?:”表示与括号中的内容匹配的字符组将不是结果数组的一部分。

在这种简单的情况下,其他选项可能是在没有任何组的情况下编写模式,因为根本不需要使用组:

/a.*j/
Run Code Online (Sandbox Code Playgroud)

如果您只想检查源文本是否与模式匹配,而不关心它找到了哪个文本,那么您可以尝试:

var result = /a.*j/.test(source);
Run Code Online (Sandbox Code Playgroud)

结果应该只返回 true|false 值。有关更多信息,请参阅http://www.javascriptkit.com/javatutors/re3.shtml


Bil*_*3rd 5

我认为您的问题是match方法正在返回一个数组。数组中的第0个项目是原始字符串,第1至第n个项目对应于第1至第n个匹配的括号项目。您的“ alert()”调用将显示整个数组。

  • 我不知道这是不正确还是措辞不佳。数组中的第一个元素(`test [0]`)不是整个字符串,而是整个正则表达式匹配的字符串部分。在这种情况下,它们恰好是相同的,但是如果正则表达式为`/ f(。*)j /`,则结果将为`fskfsd33j,skfsd33`(匹配中不包含初始`a`) 。 (4认同)