Javascript 正则表达式在花括号之间获取字符串
不幸的是,尽管我在记忆中一年至少学习一次正则表达式,但我总是忘记,因为我很少使用它们。今年我的新年决心是不再尝试学习正则表达式,所以今年为了不让我流泪,我将把它送给Stack Overflow。(去年圣诞节混音) 我想以这种格式传入一个字符串Javascript 正则表达式在花括号之间获取字符串,javascript,regex,Javascript,Regex,不幸的是,尽管我在记忆中一年至少学习一次正则表达式,但我总是忘记,因为我很少使用它们。今年我的新年决心是不再尝试学习正则表达式,所以今年为了不让我流泪,我将把它送给Stack Overflow。(去年圣诞节混音) 我想以这种格式传入一个字符串{getThis},然后返回字符串getThis。谁能帮我坚持我的新年决心 有关堆栈溢出的相关问题: 试试看 /{(.*?)}/ 这意味着,匹配{和}之间的任何字符,但不要贪婪-匹配以}结尾的最短字符串(停止*贪婪)。括号用于提取匹配的部分 另一
{getThis}
,然后返回字符串getThis
。谁能帮我坚持我的新年决心
有关堆栈溢出的相关问题:
/{(.*?)}/
这意味着,匹配{和}之间的任何字符,但不要贪婪-匹配以}结尾的最短字符串(停止*贪婪)。括号用于提取匹配的部分
另一种方法是
/{([^}]*)}/
这将匹配除}字符以外的任何字符(另一种不贪婪的方式)如果字符串始终采用该格式,则正则表达式是多余的:
>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"
子字符串(1
意味着开始一个字符(刚好超过第一个{
)和,g.length-1)
意味着获取字符,直到(但不包括)字符串长度减去一的字符。这是有效的,因为位置是基于零的,即g.length-1
是最后一个位置
对于原始海报以外的读者:如果必须是正则表达式,则如果要允许空字符串,请使用/{([^}]*)}/
;如果只希望在大括号之间至少有一个字符时匹配,请使用/{([^}]+)}/
。细分:
:启动regex模式/
:一个字面值的大括号{
:开始捕获(
:开始定义要捕获的字符类[
:“除^}
以外的任何内容”}
:好的,这就是我们的整个类定义]
:与我们刚才定义的类匹配的任意数量的字符*
:捕获完成)
:文字上的大括号必须紧跟在我们捕获的内容之后}
:结束正则表达式模式/
\{(\s*?.*?)*?\}
选择器{。
.
这里有火柴
包括空白。
.
.}
如果您希望能够进一步返回内容,请将其全部用一组括号括起来,如下所示:
\{((\s*?.*?)*?)\}
您还可以通过1美元访问内容
这也适用于函数,但我没有使用嵌套的花括号对其进行测试。您想使用regex lookahead和lookahead。这将只提供花括号内的内容:
\{(\s*?.*?)*?\}
(?<=\{)(.*?)(?=\})
(?这里有一个使用javascript替换的简单解决方案
var st = '{getThis}';
st = st.replace(/\{|\}/gi,''); // "getThis"
正如上面公认的答案所指出的,使用子字符串很容易解决原始问题,但是使用replace可以解决更复杂的用例
如果您有一个类似“randomstring999[fieldname]”的字符串
您使用稍微不同的模式来获取fieldname
var nameAttr = "randomstring999[fieldname]";
var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"
如果正则表达式不匹配,则更简单的.replace(/.*{(.*}.*/,'$1')
很遗憾地返回整个字符串。上面的代码段可以更容易地检测到匹配。用于获取包含大括号的字符串数组的正则表达式发生在字符串中,而不仅仅是查找第一个匹配项
/\{([^}]+)\}/gm
试试这个,因为它对jsnormaly有效
([^{]*?)(?=\})
试试这个:
/[^{\}]+(?=})/g
比如说
欢迎来到由#{gskinner.com},#{ssd.sd}主持的RegExr v2.1,由Media Temple托管!
将返回gskinner.com
,ssd.sd
我已经研究了其他答案,但其中似乎缺少一个重要的逻辑。即,选择两个连续括号之间的所有内容,但不选择括号
这是我的答案
\{([^{}]+)\}
您可以使用此正则表达式递归来匹配这两者之间的任何内容,甚至是另一个{}
(如JSON文本):
试试这个
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"]
即使这样也能帮我解决别人的问题
在花括号({}
)内拆分内容,其模式如下:,
{'day':1,'count':100}
例如:
#包括
#包括
#包括
使用名称空间std;
int main()
{
//要搜索的字符串
字符串s=“{'day':1,'count':100},{'day':2,'count':100}”;
//要搜索的模式的正则表达式
正则表达式e(“\\{[a-z':,0-9]+\}”);
regex_令牌_迭代器rend;
正则表达式标记迭代器a(s.begin(),s.end(),e);
而(a!=rend)cout这一个匹配所有内容,即使它在中间发现多个右大括号:
\{([\s\s]*)\}
例如:
{
"foo": {
"bar": 1,
"baz": 1,
}
}
子字符串是根据您所使用的语言而变化的内容之一。Javascript采用要停止的索引,PHP采用所需最终结果的长度(除非是负数,在这种情况下需要删除的字符数),C#又不同了……很好,很混乱……Python只是有切片,我觉得它比其他任何东西都好:p.Sweet,但不确定这是一个正则表达式。也许他问的是正则表达式,我来这里是为了同样的答案。遗憾的是,答案与问题无关。@baash05,如果你读了整个问题,OP di我甚至不想学习正则表达式,所以我不认为这是你所建议的学术练习。我想做-1因为问题是问正则表达式,我在搜索正则表达式,但被接受的答案对我来说完全没有用(而问题本身似乎很有希望)读了第一条评论后,我必须承认,如果我先回答这个问题,我本可以用同样/类似的方式回答…所以最后,+1.应该有一个反斜杠
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"]
[{'day': 1, 'count': 100}] [{'day': 2, 'count': 100}]
{
"foo": {
"bar": 1,
"baz": 1,
}
}