是否可以根据正则表达式中的前一个行匹配位置找到一个字符?
匹配字符没有固定位置。
实施例。 #符号位于第一行的位置与下一行的字符值匹配。
这将给出:2
X#ZEAKBLA
123456789
这将给出:7
XIZEAK#LA
123456789
答案 0 :(得分:4)
这是使用条件的真正复杂版本:
^(?(?=#).*\n(.)|(?(?=.#).*\n.(.)|(?(?=..#).*\n..(.)|(?(?=...#).*\n...(.)|(?(?=^....#).*\n....(.)|(?(?=^.{5}#).*\n.{5}(.)|(?(?=^.{6}#).*\n.{6}(.)|#))))))).*$
基本上它的作用是首先检查行的开头并开始多级条件(if / then / else)。
然后对越来越多的任何字符进行测试,从0开始(在此示例中最多为7),然后测试#
的匹配。
如果符合要求,它会与该行的其余部分,换行符以及上一个测试中找到的任何字符相同,这使我们处于与{{{ 1}}来自上面。
所以现在我们只捕获一个字符,这就是结果!
如果符合 n 字符后跟#
的匹配,则会测试 n <的下一个 else / em> #
之前的+1个字符,依此类推......
如果最终测试失败,则会匹配#
(在完整版本中不应出现)以使匹配失败。
最后,在关闭条件后,如果使用全局标志,则匹配该行的其余部分以避免在当前行上继续匹配。
修改强>
在匹配其余行之前,将实际捕获的测试移出测试,最后移到测试结果之外,从而降低了复杂性。
#
<强> EDIT2 强>
有点被困在这个;)
这是一个更简单的版本。 (我已将索引字符替换为^(?(?=#).*\n|(?(?=.#).*\n.|(?(?=..#).*\n..|(?(?=...#).*\n...|(?(?=....#).*\n....|(?(?=.{5}#).*\n.{5}|(?(?=.{6}#).*\n.{6}|#)))))))(.).*$
(ASCII 254),主要是为了允许正则表达式中的注释,还提高可读性(imo)。)
■
如评论中所述,它匹配所有级别中匹配之后的任意字符,从而无需每个级别字符的特定匹配。
这也使得非常更容易为测试添加级别。
答案 1 :(得分:0)
正则表达式和切片?作为EASY实施的解决方案,复杂性检查同一问题的最佳答案,来自@ClasG -amazing
<button onclick="myFunction()">Try it</button>
<p> "123#4678911" </p>
<p> 1943215927 </p>
<p id="demo"></p>
<p id="demo2"></p>
<script>
function myFunction() {
var str = "123#4678911";
var otherstr = "1943215927";
var n = str.search(/#/);
//returns 3, starts in 0
var res = otherstr.slice(n,n+1);
//cut all otherstr between 3 and 4 position
document.getElementById("demo").innerHTML = "position begnng in [0]:"+n;
document.getElementById("demo2").innerHTML = "number in 2d string: "+res;
}
</script>