正则表达式在花括号之间获取字符串"{我想在花括号之间有什么}}"

Chr*_*mbo 105 javascript regex

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

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


Stack Overflow的相关问题:

Pau*_*xon 241

尝试

/{(.*?)}/
Run Code Online (Sandbox Code Playgroud)

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

另一种方式是

/{([^}]*)}/
Run Code Online (Sandbox Code Playgroud)

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

  • 对{a} {b}不起作用只与第一个匹配 (4认同)
  • 它不会捕获大括号之间的所有内容,它会捕获大括号和大括号之间的所有内容.你将如何仅仅捕获大括号内的内容? (4认同)
  • 最后添加`g`使其成为全局搜索.参见[工作实例](http://scriptular.com/#%7B%7B(../%3F)%% 7D%7D%7C%7C%7C%7Cg%7C%7C%7C%7C%5B%22hello %20%7B%7B3%7D%7D%20于是%20another%20%7B%7B3%7D%7D%22%5D) (3认同)

meo*_*ouw 146

/\{([^}]+)\}/

/        - 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
Run Code Online (Sandbox Code Playgroud)

  • 我想找到大括号是否是java regexp中的特殊字符,这有助于很多.10X. (4认同)

Kev*_*Kev 35

如果你的字符串总是那种格式,那么正则表达式就是矫枉过正:

>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"
Run Code Online (Sandbox Code Playgroud)

  • 很好,但不确定这是一个正则表达式.也许他正在要求正则表达式,我来到这里是为了同样的答案......遗憾的是答案与这个问题无关. (22认同)
  • 子串化是根据您使用的语言而改变的事情之一.Javascript使索引停止,PHP获取所需最终结果的长度(除非它是否定的,在这种情况下需要删除的字符数) ,C#再次不同......好看又令人困惑. (6认同)
  • @ baash05,如果你读完整个问题,OP甚至不想学习正则表达式,所以我认为这不是你似乎建议的学术练习. (5认同)
  • ...而且Python只有切片,IMO比其他任何东西都好:p. (2认同)
  • 我想做-1因为问题是要求**正则表达式**,我正在寻找**正则表达式**,但是接受的答案对我来说完全没用(虽然这个问题看起来非常有希望).在阅读完第一条评论后,我必须承认,如果我先回答这个问题,我可以用同样/类似的方式回答......所以最后,+1. (2认同)

Moh*_*agd 24

试试这个:

/[^{\}]+(?=})/g
Run Code Online (Sandbox Code Playgroud)

例如

Welcome to RegExr v2.1 by #{gskinner.com},  #{ssd.sd} hosted by Media Temple!
Run Code Online (Sandbox Code Playgroud)

将返回gskinner.com,ssd.sd.

  • 说明:虽然 [^\{\}]+ 将匹配不是大括号的任何内容,但先行断言 (?=}) 将确保仅传递大括号之前的部分。使用 / ... /g 我们可以获得所有出现的情况,而不仅仅是第一个。 (3认同)
  • 太好了,你能解释一下为什么在第一个块中使用“\}”吗? (2认同)
  • 不错,但它会匹配任何以 `}` 结尾的组,即使它不以 `{` 开头。 (2认同)
  • 这是唯一真正有效的正确答案。 (2认同)

chi*_*him 18

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

var st = '{getThis}';

st = st.replace(/\{|\}/gi,''); // "getThis"
Run Code Online (Sandbox Code Playgroud)

正如上面接受的答案指出原始问题很容易用子串解决,但使用replace可以解决更复杂的用例

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

var nameAttr = "randomstring999[fieldname]";

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


小智 14

这个在Textmate中工作,它匹配大括号之间的CSS文件中的所有内容.

\{(\s*?.*?)*?\}
Run Code Online (Sandbox Code Playgroud)

selector {. . matches here including white space. . .}

如果你想进一步能够返回内容,那么将它全部包装在一组括号中,如下所示:

\{((\s*?.*?)*?)\}
Run Code Online (Sandbox Code Playgroud)

并且您可以通过$ 1访问内容.

这也适用于函数,但我没有使用嵌套的大括号进行测试.


小智 11

你想使用正则表达式前瞻和后瞻.这将只给出花括号内的内容:

(?<=\{)(.*?)(?=\})
Run Code Online (Sandbox Code Playgroud)

  • @ Somatik-是的,ECMAScript不支持负向前瞻和后退. (5认同)

Hem*_*ari 8

尝试这个

let path = "/{id}/{name}/{age}";
const paramsPattern = /[^{\}]+(?=})/g;
let extractParams = path.match(paramsPattern);
console.log("extractParams", extractParams) // prints all the names between {} = ["id", "name", "age"]
Run Code Online (Sandbox Code Playgroud)

  • 这正是我想要的:)这将返回不带大括号的结果,其他解决方案也随之返回 (2认同)
  • 太好了,最好的答案在这里。 (2认同)

Er.*_*wal 5

用于获取包含大括号的字符串数组的正则表达式出现在字符串中,而不仅仅是查找第一次出现。

 /\{([^}]+)\}/gm 
Run Code Online (Sandbox Code Playgroud)


sou*_*der 5

我已经研究了其他答案,他们似乎缺少一个重要的逻辑。即,选择两个连续括号之间的所有内容,但不是括号

所以,这是我的答案

\{([^{}]+)\}
Run Code Online (Sandbox Code Playgroud)


Ren*_*ato 5

即使它在中间发现多个右花括号,它也会匹配所有内容:

\{([\s\S]*)\}

例子:

{
  "foo": {
    "bar": 1,
    "baz": 1,
  }
}
Run Code Online (Sandbox Code Playgroud)