【问题标题】:Match last character, get next to last if regex is null匹配最后一个字符,如果正则表达式为空,则排在最后一个字符
【发布时间】:2014-03-28 00:49:29
【问题描述】:

我正在尝试获取字符串的最后一个字符,但前提是它与以下 RegEx 匹配:

/\W/

如果不匹配,我希望它移动到下一个最后一个字符并再次进行测试,直到找到匹配项。

function getLastChar(s) {
    var l = s.length - 1;

    return s[l - i]; // need logic to keep checking for /\W/
}
getLastChar('hello.'); // returns '.', want it to return 'o'

如果字符不是字母/数字,我对如何匹配有以下想法;但是,我正在寻找一种更优雅的解决方案,它可以让我在一行中返回最后一个匹配的字符,并带有三元 if()

if(string.match(/\W/) !== null){ //keep looking for a match, going backwards. }

【问题讨论】:

  • 类似string.match(/(\w)\W*$/)?如果有匹配,它将位于结果数组的索引[1]
  • 您确定要\W 而不是\w?使用\W,您将只匹配非单词字符,因此'o' 不匹配/\W/
  • hmm.. 您的要求与您的示例返回值似乎不匹配。 \W 表示“非单词字符”。所以你说你想匹配最后一个非单词字符。那么在你的例子中,你说它返回“。”但你期待“o”。但是“o”是一个单词字符。
  • Patrick:您应该询问实际问题,而不是您认为最好的解决方案。这样做只会增加太多的混乱。

标签: javascript regex string-matching


【解决方案1】:
/(\w)\W*$/

捕获一个\w 字符,后跟零个或多个\W 字符,锚定到主题的末尾。

[在 cmets 之后编辑。]

【讨论】:

  • 你会想要测试你的解决方案。
  • 虽然这似乎是问题所要求的,但这将与'hello.' 中的. 匹配,这显然不是目标。
  • OP 不理解 \W 的作用,或者问题措辞奇怪。
  • +1,答案是正确的,OP混淆了\w\W。他确实要求匹配\W 的字符,即点。如果他想得到o,他应该使用/(\w)\W*$/
  • @Bergi: 期望的结果被清楚地描述了,但这并没有做到。他对问题的措辞有点混乱,但似乎他想匹配\W 以继续向后搜索。 if(string.match(/\W/) !== null){ //keep looking for a match, going backwards. 换句话说,这有点像 XY 问题,因为他在询问他认为的最佳解决方案。
【解决方案2】:

很简单.. 贪婪地匹配到最后一个\W

string.match(/.*(\W)/)

【讨论】:

  • 如果字符串包含换行符怎么办?
  • @Bergi 好吧,OP 确实说“返回单行上的最后一个匹配字符”
  • @Bergi 但如果 OP 确实想考虑它,那很容易解决:/(?:.|\n)*(\W)/
  • @Bergi .. 但由于不同的原因我可能错了.. 他的要求与他的示例预期结果不符!
【解决方案3】:

如果您正在寻找一个简单的答案,您也许可以使用单个正则表达式来完成它,无需循环 - 如下所示:

^.*(\W)[^\W]*$

捕获组将具有最后一个非单词字符。

例如,在 ~~~~99*9 上运行此正则表达式会将字符 * 放入捕获组。

编辑:

但是,在重新阅读您的问题后,您似乎真的打算使用 \w 而不是 \W - 换句话说,您想要最后一个单词字符,而不是最后一个非单词字符。这很容易通过在上面的正则表达式中将 \W 替换为 \w 来解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多