【发布时间】:2014-11-14 04:41:23
【问题描述】:
这是我的问题:
- 我有一个正则表达式,这个表达式包含一个,而且只有一个捕获组,
- 此正则表达式无法更改,
- 我有一个字符串,将匹配这个正则表达式,
- 正则表达式将匹配完整的字符串,它不是查找,如果正则表达式无法与字符串匹配,则函数将在到达此步骤之前失败。
=> 我想获取捕获的子字符串在字符串中的位置,以及它的长度。
示例;
如果我的正则表达式是
^.*?\/F?L?(\d+)$
我的字符串是
"( 413) 250/FL250"
我想得到14和3。
在这些条件下,搜索将返回 1。
这是一个简单的例子,但我们可以有非常复杂的正则表达式,但原理总是一样的:一个且只有一个捕获组,并在主组中找到捕获的字符串的位置。
非常感谢您的帮助,我被卡住了。
版本:
所以我用 ant(我们的基本工作环境是 ant)做了一些事情,包括获取捕获组的 leftContext,然后确定它的大小。要获得leftContext,我只需将捕获组的括号移到左侧。例如:\d(\s) 变为 (\d)\s。
所以我有一个问题:
<macrodef name="Get_CaptureGroup_Position" >
<attribute name="text" />
<attribute name="mask" />
<attribute name="start" />
<attribute name="end" />
<sequential>
<var name="_GMLCS_modified_regex" unset="true"/>
<var name="_GMLCS_leftContext" unset="true"/>
<var name="_GMLCS_leftContext_len" unset="true"/>
<var name="_GMLCS_CapturedGroup" unset="true"/>
<var name="_GMLCS_CapturedGroup_len" unset="true"/>
<propertyregex property="_GMLCS_modified_regex" override="yes" input="@{mask}" regexp="(.*[^\\])\)([^?].*)" replace="\1\2" />
<propertyregex property="_GMLCS_modified_regex" override="yes" input="${_GMLCS_modified_regex}" regexp="(.*[^\\])\(([^?].*)" replace="\1)\2" />
<var name="_GMLCS_modified_regex" value="(${_GMLCS_modified_regex}" />
<propertyregex property="_GMLCS_leftContext" override="yes" input="@{text}" regexp="${_GMLCS_modified_regex}" select="\1" />
<propertyregex property="_GMLCS_CapturedGroup" override="yes" input="@{text}" regexp="@{mask}" select="\1" />
<getAttributeLength text="${_GMLCS_leftContext}" property="_GMLCS_leftContext_len" />
<getAttributeLength text="${_GMLCS_CapturedGroup}" property="_GMLCS_CapturedGroup_len" />
<math result="_GMLCS_leftContext_len" operation="+" operand1="${_GMLCS_leftContext_len}" operand2="1" />
<math result="_GMLCS_CapturedGroup_len" operation="+" operand1="${_GMLCS_leftContext_len}" operand2="${_GMLCS_CapturedGroup_len}" />
<var name="@{start}" value="${_GMLCS_leftContext_len}" />
<var name="@{end}" value="${_GMLCS_CapturedGroup_len}" />
<var name="_GMLCS_modified_regex" unset="true"/>
<var name="_GMLCS_leftContext" unset="true"/>
<var name="_GMLCS_leftContext_len" unset="true"/>
<var name="_GMLCS_CapturedGroup" unset="true"/>
<var name="_GMLCS_CapturedGroup_len" unset="true"/>
</sequential>
</macrodef>
我的问题是,当我通过这个正则表达式时:
(?:A|.*)/F?L?(\d+)\s*\d*(?:A|.*)
我明白了:
第一个属性正则表达式:
(?:A|.*)/F?L?(\d+\s*\d*(?:A|.*) = CORRECT
第二个属性正则表达式:
(?:A|.*)/F?L?)\d+\s*\d*(?:A|.*) = CORRECT
变量:
((?:A|.*)/F?L?)\d+\s*\d*(?:A|.*) = CORRECT
开始和结束:7 和 10 = 正确。
这实际上是正确的,但我认为不应该,我的问题是为什么(?:...) 块末尾的“)”没有被删除?
【问题讨论】:
标签: javascript regex string indexing substring