0

我是正则表达式的新手。我正在尝试使用 JavaScript 正则表达式从字符串中提取括号内的最后一个子字符串。它不适合我。相反,我得到了一对括号内的第一个子字符串。有人能帮我吗?

这是一个例子。我正在尝试提取子字符串'xyz',但我得到的是'abc'。

var str1 = 'Hello World (abc)'; // May or may not contain parentheses
var str2 = '(xyz)'; // Definitely contains parentheses
var troublesomeString = str1 + ' ' + str2; // This is the string I'm working with

var result = myFunc(troublesomeString);
alert(result); // Should say 'xyz', but instead says 'abc'

...

function myFunc(troublesomeString) {
    // Here I am trying to get '(xyz)', but am instead getting '(abc) (xyz)'
    var resultArray = troublesomeString.match(/\(.+\)$/);
    troublesomeString = resultArray[0];

    // Here I am trying to get 'xyz', but am instead getting 'abc'
    resultArray = troublesomeString.match(/[a-z]+/); // Adding a $ after + doesn't help
    troublesomeString = resultArray[0]; // resultArray[1] is null

    return troublesomeString;
}
4

4 回答 4

3

您正在匹配必须结束字符串的第一个“(”和最后一个“)”之间的所有内容。

试试这个来匹配最后一组括号的内容(它仍然必须按照'$'结束字符串):

var resultArray = troublesomeString.match(/\([^)]+\)$/);
于 2013-05-30T01:54:07.337 回答
1

第一次尝试

您需要添加\(\)

resultArray = troublesomeString.match(/\([a-z]+\)$/);

结果是["(xyz)"],注意$那里。

最后一次尝试

如果你想group输出一些东西,你应该把它们包装()起来:

resultArray = troublesomeString.match(/\(([a-z]+)\)$/);

注意这( )对。

结果是["(xyz)", "xyz"]

你知道下一步该做什么。

于 2013-05-30T01:59:18.637 回答
0

尝试使用此正则表达式而不是您正在使用的第一个正则表达式:/\([^\(]+\)$/^\(告诉它接受除 a 之外的任何字符(

请注意,您可以使用此站点http://regexpal.com/来帮助您构建和测试正则表达式。

于 2013-05-30T02:05:04.170 回答
0

您需要使用“g”开关来执行全局搜索。

这是一个工作示例:

<script type="text/javascript">
    var str = "test (abc) (xyz)";
    var result = str.match(/\([^)]+\)/g);

    alert(result[result.length - 1]);
</script>
于 2013-05-30T02:05:06.883 回答