正则表达式获取大括号之间的字符串

IT技术 javascript regex
2021-01-25 15:29:16

不幸的是,尽管在我记得的很多年里,我每年至少尝试学习一次正则表达式,但我总是忘记,因为我很少使用它们。今年我的新年决心是不再尝试学习正则表达式 -所以今年为了让我免于流泪,我会把它交给 Stack Overflow(去年圣诞节混音)。

我想以这种格式传入一个字符串{getThis},并返回该字符串getThis任何人都可以帮助我坚持我的新年决心吗?


Stack Overflow 上的相关问题:

6个回答

尝试

/{(.*?)}/

这意味着,匹配 { 和 } 之间的任何字符,但不要贪婪 - 匹配以 } 结尾的最短字符串(? 停止 * 贪婪)。括号可让您提取匹配的部分。

另一种方式是

/{([^}]*)}/

这匹配除 } 字符之外的任何字符(另一种不贪婪的方式)

它不会捕获大括号之间的所有内容,而是捕获大括号和大括号本身之间的所有内容。您将如何仅捕获大括号内的内容?
2021-03-13 15:29:16
@Reality-Torrent,如果我指定 g 选项来获取所有匹配项,我也看到它捕获了大括号。原来我应该在循环中使用 Regex.exec 而不是 Javascript 中的 string.match 来拥有 g 标志,并允许捕获组。参见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-26 15:29:16
这很好,但是否有可能在可变数量的花括号组合之间匹配任何东西?例如:“{这应该匹配}这不应该{这应该再次}等等{on}”?我想检索不在大括号内的值。另外:句子中不会使用大括号并且没有堆叠(这永远不会发生:“{some {text}}”)。任何人都知道怎么做:)?谢谢!(ps:赞成这个解决方案)
2021-03-29 15:29:16
g在末尾添加 a使其成为全局搜索。查看一个工作示例
2021-03-29 15:29:16
我喜欢你不需要在这里转义大括号,因为正则表达式解析器似乎意识到它们不是量词......好吧,我在 python 中这样做,但我认为 javascript 正则表达式是这样工作的也
2021-03-31 15:29:16
/\{([^}]+)\}/

/        - delimiter
\{       - opening literal brace escaped because it is a special character used for quantifiers eg {2,3}
(        - start capturing
[^}]     - character class consisting of
    ^    - not
    }    - a closing brace (no escaping necessary because special characters in a character class are different)
+        - one or more of the character class
)        - end capturing
\}       - the closing literal brace
/        - delimiter
@Anil 您似乎使用字符串作为拆分参数而不是正则表达式。你想做什么?
2021-03-27 15:29:16
@meouw sa = s.split("/\{([^}]+)\}/"); 给出编译错误。非法重复,无效的转义字符。
2021-03-31 15:29:16

如果您的字符串将始终采用该格式,则使用正则表达式就有点过分了:

>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"

substring(1表示从(刚好经过第一个{开始一个字符,,g.length-1)表示取字符直到(但不包括)字符串长度减一的字符。这是有效的,因为该位置是从零开始的,即g.length-1是最后一个位置。

对于比原来的海报其他读者:如果是一个正则表达式,使用/{([^}]*)}/,如果你想允许空字符串,或者/{([^}]+)}/如果你想只匹配时,有花括号之间至少有一个字符。分解:

  • /: 开始正则表达式模式
    • {: 文字花括号
      • (: 开始捕捉
        • [: 开始定义一类要捕获的字符
          • ^}:“任何事情比其他}
        • ]: 好的,这就是我们整个类的定义
        • *: 匹配我们刚刚定义的那个类的任意数量的字符
      • ): 完成捕获
    • }: 文字花括号必须紧跟我们捕获的内容
  • /: 结束正则表达式
...而 Python 只是有切片,IMO 比其他任何东西都好:p。
2021-03-11 15:29:16
@ baash05,如果你阅读了整个问题,OP 甚至不想学习正则表达式,所以我认为这不是你似乎暗示的学术练习。
2021-03-14 15:29:16
我想做 -1 因为问题是要求regex,我正在寻找regex,但接受的答案对我来说完全没用(虽然这个问题本身似乎很有希望)。在阅读第一条评论后,我必须承认,如果我先回答这个问题,我可以用相同/类似的方式回答......所以最后,+1。
2021-03-21 15:29:16
不错,但不确定这是一个正则表达式。也许他是在要求正则表达式,而我来这里是为了同样的答案..可悲的是,答案与问题无关..
2021-03-22 15:29:16
子串是根据您使用的语言而改变的事情之一。Javascript 使用索引停止,PHP 使用所需最终结果的长度(除非它是负数,在这种情况下需要删除字符数) , C# 又不同了...很好而且令人困惑。
2021-04-05 15:29:16

试试这个:

/[^{\}]+(?=})/g

例如

Welcome to RegExr v2.1 by #{gskinner.com},  #{ssd.sd} hosted by Media Temple!

会回来gskinner.comssd.sd

不错,但它会匹配任何以 结尾的组},即使它不以{.
2021-03-13 15:29:16
解释:虽然 [^\{\}]+ 将匹配任何不是大括号的内容,但先行断言 (?=}) 将确保只传递大括号之前的部分。使用 / ... /g 我们得到所有的出现,而不仅仅是第一个。
2021-03-13 15:29:16
这是唯一真正有效的正确答案。
2021-03-26 15:29:16
太好了,你能解释一下为什么\}在第一个块中使用吗?
2021-03-28 15:29:16

这是一个使用javascript替换的简单解决方案

var st = '{getThis}';

st = st.replace(/\{|\}/gi,''); // "getThis"

由于上面接受的答案指出原始问题很容易用子字符串解决,但使用替换可以解决更复杂的用例

如果你有一个像 "randomstring999[fieldname]" 这样的字符串,你可以使用稍微不同的模式来获取 fieldname

var nameAttr = "randomstring999[fieldname]";

var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"