根据正则表达式中当前行的位置在下一行查找字符

时间:2017-05-31 10:09:14

标签: regex

是否可以根据正则表达式中的前一个行匹配位置找到一个字符?

匹配字符没有固定位置。

实施例。 #符号位于第一行的位置与下一行的字符值匹配。

这将给出:2

X#ZEAKBLA
123456789

这将给出:7

XIZEAK#LA
123456789

2 个答案:

答案 0 :(得分:4)

这是使用条件的真正复杂版本:

^(?(?=#).*\n(.)|(?(?=.#).*\n.(.)|(?(?=..#).*\n..(.)|(?(?=...#).*\n...(.)|(?(?=^....#).*\n....(.)|(?(?=^.{5}#).*\n.{5}(.)|(?(?=^.{6}#).*\n.{6}(.)|#))))))).*$

基本上它的作用是首先检查行的开头并开始多级条件(if / then / else)。

然后对越来越多的任何字符进行测试,从0开始(在此示例中最多为7),然后测试#的匹配。

如果符合要求,它会与该行的其余部分,换行符以及上一个测试中找到的任何字符相同,这使我们处于与{{{ 1}}来自上面。

所以现在我们只捕获一个字符,这就是结果!

如果符合 n 字符后跟#的匹配,则会测试 n <的下一个 else / em> #之前的+1个字符,依此类推......

如果最终测试失败,则会匹配#(在完整版本中不应出现)以使匹配失败。

最后,在关闭条件后,如果使用全局标志,则匹配该行的其余部分以避免在当前行上继续匹配。

See it here at regex101

修改

在匹配其余行之前,将实际捕获的测试移出测试,最后移到测试结果之外,从而降低了复杂性。

#

Here at regex101.

<强> EDIT2

有点被困在这个;)

这是一个更简单的版本。 (我已将索引字符替换为^(?(?=#).*\n|(?(?=.#).*\n.|(?(?=..#).*\n..|(?(?=...#).*\n...|(?(?=....#).*\n....|(?(?=.{5}#).*\n.{5}|(?(?=.{6}#).*\n.{6}|#)))))))(.).*$ (ASCII 254),主要是为了允许正则表达式中的注释,还提高可读性(imo)。)

如评论中所述,它匹配所有级别中匹配之后的任意字符,从而无需每个级别字符的特定匹配。

这也使得非常更容易为测试添加级别。

At regex101

答案 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>