不幸的是,尽管尽我所能记住,尝试了一年至少一年一次的正则表达式学习,但我却经常忘记,因为我很少使用它们。今年,我新年的决心是不要再尝试学习正则表达式- 因此,今年,为了避免让我流泪,我将其交给Stack Overflow。(去年圣诞节混音)。
我想以这种格式传递一个字符串{getThis}
,然后返回该字符串getThis
。有人能协助我们坚持我的新年决议吗?
有关堆栈溢出的相关问题:
不幸的是,尽管尽我所能记住,尝试了一年至少一年一次的正则表达式学习,但我却经常忘记,因为我很少使用它们。今年,我新年的决心是不要再尝试学习正则表达式- 因此,今年,为了避免让我流泪,我将其交给Stack Overflow。(去年圣诞节混音)。
我想以这种格式传递一个字符串{getThis}
,然后返回该字符串getThis
。有人能协助我们坚持我的新年决议吗?
有关堆栈溢出的相关问题:
Answers:
如果您的字符串将始终是该格式,则正则表达式会显得过大:
>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"
substring(1
表示以一个字符开头(刚好超过第一个字符{
),并且,g.length-1)
表示以直到(但不包括)字符串长度减去一个字符为止。这是可行的,因为位置是从零开始的,即g.length-1
最后一个位置。
对于比原来的海报其他读者:如果有是一个正则表达式,使用/{([^}]*)}/
,如果你想允许空字符串,或者/{([^}]+)}/
如果你想只匹配时,有花括号之间至少有一个字符。分解:
/
:启动正则表达式模式
{
:大括号
(
:开始捕获
[
:开始定义要捕获的字符类
^}
:“除}
”之外的任何东西]
:好的,那是我们全班的定义*
:与我们刚定义的类相匹配的任意数量的字符)
:完成捕获}
:大括号必须立即跟随我们捕获的内容/
:结束正则表达式模式尝试
/{(.*?)}/
也就是说,匹配{和}之间的任何字符,但不要贪婪-匹配以}结尾的最短字符串(?停止*为贪婪)。括号使您可以提取匹配的部分。
另一种方式是
/{([^}]*)}/
这匹配除} char以外的任何字符(不贪婪的另一种方式)
/\{([^}]+)\}/
/ - 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
试试这个:
/[^{\}]+(?=})/g
例如
Welcome to RegExr v2.1 by #{gskinner.com}, #{ssd.sd} hosted by Media Temple!
将返回gskinner.com
,ssd.sd
。
\}
在第一块中使用吗?
}
,即使它不是以开头的{
。
这是使用javascript替换的简单解决方案
var st = '{getThis}';
st = st.replace(/\{|\}/gi,''); // "getThis"
正如上面公认的答案所指出的那样,原始问题很容易用子字符串解决,但是使用replace可以解决更复杂的用例
如果您有“ randomstring999 [fieldname]”之类的字符串,则使用略有不同的模式来获取fieldname
var nameAttr = "randomstring999[fieldname]";
var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"
此代码在Textmate中有效,并且将大括号之间的CSS文件中的所有内容都匹配。
\{(\s*?.*?)*?\}
selector {.
.
matches here
including white space.
.
.}
如果您想进一步返回内容,则将其全部包装在另一组括号中,如下所示:
\{((\s*?.*?)*?)\}
您可以通过$ 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"]
用于获取带有大括号括起来的字符串数组的正则表达式出现在字符串中,而不仅仅是找到第一个出现的字符串。
/\{([^}]+)\}/gm
var re = /{(.*)}/;
var m = "{helloworld}".match(re);
if (m != null)
console.log(m[0].replace(re, '$1'));
.replace(/.*{(.*)}.*/, '$1')
不幸的是,如果正则表达式不匹配,则简单的返回整个字符串。上面的代码段可以更轻松地检测到匹配项。
根据http://www.regextester.com尝试此方法,它可正常用于js。
([^{]*?)(?=\})
/([^{]*?)\w(?=\})/gmi
甚至这在尝试解决某人的问题时也对我有帮助,
将内容拆分为花括号(
{}
),其模式为{'day': 1, 'count': 100}
。
例如:
#include <iostream>
#include <regex>
#include<string>
using namespace std;
int main()
{
//string to be searched
string s = "{'day': 1, 'count': 100}, {'day': 2, 'count': 100}";
// regex expression for pattern to be searched
regex e ("\\{[a-z':, 0-9]+\\}");
regex_token_iterator<string::iterator> rend;
regex_token_iterator<string::iterator> a ( s.begin(), s.end(), e );
while (a!=rend) cout << " [" << *a++ << "]";
cout << endl;
return 0;
}
输出:
[{'day': 1, 'count': 100}] [{'day': 2, 'count': 100}]