如果您首先说明您要提取的内容会更好。
您也没有指出您正在使用哪个正则表达式引擎,这很重要,因为它们的功能各不相同,但是......
假设您只想捕获:
- 以 + 或 - 开头的词
- 具有尾随 ^ 后跟可选句点后跟一个或多个数字的单词
并且单词是一个或多个字母的序列
我会使用:
([a-zA-Z]+\^\.?\d+|[-+][a-zA-Z]+)
分解为:
( # start capture group
[a-zA-Z]+ # one or more letters - note \w matches numbers and underscores
\^ # literal
\.? # optional period
\d+ # one or more digits
| # OR
[+-]? # optional plus or minus
[a-zA-Z]+ # one or more letters or underscores
) # end of capture group
编辑
要捕获简单的单词(没有前导或尾随字符),您需要稍微重新排列正则表达式。我会使用:
([+-][a-zA-Z]+|[a-zA-Z]+\^(?:\.\d+|\d+\.\d+|\d+)|[a-zA-Z]+)
分解为:
( # start capture group
[+-] # literal plus or minus
[a-zA-Z]+ # one or more letters - note \w matches numbers and underscores
| # OR
[a-zA-Z]+ # one or more letters
\^ # literal
(?: # start of non-capturing group
\. # literal period
\d+ # one or more digits
| # OR
\d+ # one or more digits
\. # literal period
\d+ # one or more digits
| # OR
\d+ # one or more digits
) # end of non-capturing group
| # OR
[a-zA-Z]+ # one or more letters
) # end of capture group
另请注意,根据您更新的要求,此正则表达式捕获真正的非负数(即 0、1、1.2、1.23)以及缺少前导数字的那些(即 0.1、.12)
进一步编辑
此正则表达式将仅匹配以逗号分隔的以下模式:
- 单词
- 带前导加号或减号的单词
带有尾随 ^ 的单词,后跟 \d+、\d+.\d+ 或 .\d+ 形式的正数
([+-][A-Za-z]+|[A-Za-z]+\^(?:.\d+|\d+(?:.\d+)?)|[A-Za-z] +)(?=,|\s|$)
请注意,有用的匹配将出现在第一个捕获组中,而不是整个匹配。
所以,在 Javascript 中,你会:
var src="hello , hello ,hello,+hello,-hello,hello+,hello-,hello^1,hello^1.0,hello^.1",
RE=/([+-][A-Za-z]+|[A-Za-z]+\^(?:\.\d+|\d+(?:\.\d+)?)|[A-Za-z]+)(?=,|\s|$)/g;
while(RE.test(src)){
console.log(RegExp.$1)
}
产生:
hello
hello
hello
+hello
-hello
hello^1
hello^1.0
hello^.1