正则表达式查找可选字符我的文本字符串可能类似于下面的 Str1 和 Str2:
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
因此,有一个以逗号分隔的值列表,前缀为关键字和冒号。 以逗号分隔的列表后面可能有也可能没有其他变量。 如果是,则逗号分隔列表和后续变量将用分号分隔,如 Str2 中所示。
我想获取以逗号分隔的列表。 我尝试过以下正则表达式
ParamLst1 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
我认为它会找到“ParamList:”,然后 (.*) 贪婪会将所有内容匹配到字符串末尾,但会备份直到找到零个或一个分号。
我一定是想错了,因为使用 Str2,我将所有内容都返回到字符串的末尾(“Param1,Param2,Param3;Var2;Var3”)
我可以用函数这个词来拯救自己:
word(1,ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*)")[3],";");
这适用于 Str1 和 Str2,但增加了复杂性,如果我能更好地掌握正则表达式,我确信这是不必要的!
有任何想法吗 ?
高级统计建模数据混合和清理回复:正则表达式查找可选字符或者,使用正则表达式
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
regex(Str2, "^([^:]*):([^;]*);?(.*)$", "part1='\1' part2='\2' part3='\3'" )
</CODE></P><P><STRONG>part1='ParamList'part2='Param1,Param2,Param3'part3=''</STRONG></P><P><STRONG>或者</STRONG></P><P><STRONG>part1='ParamList'part2='Param1,Param2,Param3'part3='Var2;Var3'</STRONG></P><P>开头 ^ 和结尾 $ 强制正则表达式从头到尾匹配。 [^:] 匹配不是 : 的字符,[^;] 匹配不是 ; 的字符。 。 孤独的 : 超越了必需的 : 和 ;?是可选的; 。.* 匹配其余字符(如果有)。</P><P>括号构成捕获组。 这些组在第三个参数中被称为 \1、\2 和 \3,并插入到生成结果的字符串中。</P><P>请注意,所有 * 运算符都是这样编写的,因此它们永远不会“走得太远”并且需要备份。 这使得匹配变得高效。 尽可能使用负字符类来匹配定界符之前的所有内容。</P><P>如果您想要的话,结果字符串可能是“\2”。</P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-335077" slang="en-US" mode="NONE">回复:正则表达式查找可选字符</LINGO-SUB><LINGO-BODY id="lingo-body-335077" slang="en-US" mode="NONE"><P>这是使用 JSL 字符串函数的简单暴力方法。</P>
<PRE><CODE class=" language-jsl">Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
s1 = substr(str1, 11);
w1 = words(s1, ";");
plist1 = words(w1[1], ",");
s2 = substr(str2, 11);
w2 = words(s2, ";");
plist2 = words(w2[1], ",");<BR />show(plist1, plist2);
输出:
plist1 = {"Param1", "Param2", "Param3"};
plist2 = {"Param1", "Param2", "Param3"};