匹配以 imacros 中的字符串开头和结尾的字符串模式
Matching a string pattern which starts and ends with a string in imacros
假设这是我的文本
SET abc "<select name="ctl00$ContentPlaceHolder1$ddlyear" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder1$ddlyear\',\'\')', 0)" id="ctl00_ContentPlaceHolder1_ddlyear" class="page-heading" style="background-color: rgb(255, 244, 244); width: 95px; outline: 1px solid blue;"> <option selected="selected" value="Select Year">Select Year</option> <option value="2000">2000</option>
<option value="2001">2001</option>
<option value="2002">2002</option>
<option value="2003">2003</option>
<option value="2004">2004</option>
<option value="2005">2005</option>
<option value="2006">2006</option>
<option value="2007">2007</option>
<option value="2008">2008</option>
<option value="2009">2009</option>
<option value="2010">2010</option>
<option value="2011">2011</option>
<option value="2012">2012</option>
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>
<option value="2016">2016</option>
<option value="2017">2017</option>
</select>"
我只想从上面的文本中提取年份,所以我将起始字符串匹配为 <option value=
并将结束字符串匹配为 </option>
并获取这两个模式之间的字符串
SET text EVAL("var s=\"{{abc}}\"; s.match(\"(?![<option value=])(.*)(?=</option>)\");")
但它再次给出了整个文本
如果我这样做
SET text EVAL("var s=\"{{abc}}\"; s.match(\"(?![<option value=])(.*)(?=</option>)\");s[0]")
这给了我 "<"
有什么建议我哪里出错了吗?
谢谢
我无法测试 imacros 版本,但您的普通正则表达式错误地使用了方括号和否定前瞻。
这是一个与您要查找的内容匹配的正则表达式(</option>
之前的所有数字):
([0-9]*)(?=</option>)
演示在这里:
https://regex101.com/r/jA3Al9/2
编辑:正如我所说,我无法测试它,但我猜你正在寻找:
SET text EVAL("var s=\"{{abc}}\"; s.match(\"([0-9]*)(?=</option>)\");s[0]")
我想你可以试试这样更简单的方法:
TAG XPATH="id('ctl00_ContentPlaceHolder1_ddlyear')" EXTRACT=TXTALL
SET numbers EVAL("'{{!EXTRACT}}'.replace('Select Year[OPTION]', '');")
PROMPT {{numbers}}
从@Shugar 的回答中添加了几行以获得答案
TAG XPATH="id('ctl00_ContentPlaceHolder1_ddlyear')" EXTRACT=TXTALL
SET numbers EVAL("'{{!EXTRACT}}'.replace('Select Year[OPTION]', '');")
SET numb1 EVAL("'{{numbers}}'.replace(/[OPTION]/g,'');")
SET numb2 EVAL("'{{numb1}}'.split('[]')")
PROMPT {{numb2}}
假设这是我的文本
SET abc "<select name="ctl00$ContentPlaceHolder1$ddlyear" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder1$ddlyear\',\'\')', 0)" id="ctl00_ContentPlaceHolder1_ddlyear" class="page-heading" style="background-color: rgb(255, 244, 244); width: 95px; outline: 1px solid blue;"> <option selected="selected" value="Select Year">Select Year</option> <option value="2000">2000</option>
<option value="2001">2001</option>
<option value="2002">2002</option>
<option value="2003">2003</option>
<option value="2004">2004</option>
<option value="2005">2005</option>
<option value="2006">2006</option>
<option value="2007">2007</option>
<option value="2008">2008</option>
<option value="2009">2009</option>
<option value="2010">2010</option>
<option value="2011">2011</option>
<option value="2012">2012</option>
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>
<option value="2016">2016</option>
<option value="2017">2017</option>
</select>"
我只想从上面的文本中提取年份,所以我将起始字符串匹配为 <option value=
并将结束字符串匹配为 </option>
并获取这两个模式之间的字符串
SET text EVAL("var s=\"{{abc}}\"; s.match(\"(?![<option value=])(.*)(?=</option>)\");")
但它再次给出了整个文本 如果我这样做
SET text EVAL("var s=\"{{abc}}\"; s.match(\"(?![<option value=])(.*)(?=</option>)\");s[0]")
这给了我 "<"
有什么建议我哪里出错了吗?
谢谢
我无法测试 imacros 版本,但您的普通正则表达式错误地使用了方括号和否定前瞻。
这是一个与您要查找的内容匹配的正则表达式(</option>
之前的所有数字):
([0-9]*)(?=</option>)
演示在这里: https://regex101.com/r/jA3Al9/2
编辑:正如我所说,我无法测试它,但我猜你正在寻找:
SET text EVAL("var s=\"{{abc}}\"; s.match(\"([0-9]*)(?=</option>)\");s[0]")
我想你可以试试这样更简单的方法:
TAG XPATH="id('ctl00_ContentPlaceHolder1_ddlyear')" EXTRACT=TXTALL
SET numbers EVAL("'{{!EXTRACT}}'.replace('Select Year[OPTION]', '');")
PROMPT {{numbers}}
从@Shugar 的回答中添加了几行以获得答案
TAG XPATH="id('ctl00_ContentPlaceHolder1_ddlyear')" EXTRACT=TXTALL
SET numbers EVAL("'{{!EXTRACT}}'.replace('Select Year[OPTION]', '');")
SET numb1 EVAL("'{{numbers}}'.replace(/[OPTION]/g,'');")
SET numb2 EVAL("'{{numb1}}'.split('[]')")
PROMPT {{numb2}}