【问题标题】:How to extract the last substring using JavaScript regular expressions?如何使用 JavaScript 正则表达式提取最后一个子字符串?
【发布时间】:2013-05-30 01:48:51
【问题描述】:

我是正则表达式的新手。我正在尝试使用 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;
}

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

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

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

    var resultArray = troublesomeString.match(/\([^)]+\)$/);
    

    【讨论】:

    • @hawaiijim 随意将其标记为已回答。 ;) ...不客气
    【解决方案2】:

    第一次尝试

    你需要添加\(\)

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

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

    最后一次尝试

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

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

    注意( ) 对。

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

    而且你知道下一步该做什么。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这个解决方案也有效。当括号前面有 ^ 时,您似乎不需要转义括号
      【解决方案4】:

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

      这是一个工作示例:

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

      【讨论】:

      • 小心。如果未找到匹配项,则 result 将为 null,尝试读取 nulllength 属性将引发错误,因此请测试一下第一:alert(result &amp;&amp; result[result.length - 1]);
      • 在我的情况下,最后一组括号保证存在,所以这个解决方案有效。由于无论如何我都需要第二个正则表达式来删除括号,因此“g”开关不会比 Shadow Creeper 的类似解决方案增加任何好处(或造成任何伤害)。不过,很高兴了解“g”开关的工作原理。
      • 实际上,我认为“g”开关有一个潜在的好处。与使用 $ 时不同,使用“g”开关意味着右括号不需要是字符串中的最后一个字符。在我的情况下,它将是最后一个字符,但是学习如何从右到左解析其他字符串是很好的。
      猜你喜欢
      • 2020-09-21
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多