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

Regex 根据正则表达式中当前行的位置查找下一行的字符,regex,Regex,是否可以根据正则表达式中的前一行匹配位置查找字符 匹配字符没有固定位置 例如。如果#符号位于第一行,则与下一行的字符值相匹配 这将给出:2 X#ZEAKBLA 123456789 这将给出:7 XIZEAK#LA 123456789 下面是一个使用条件的非常复杂的版本: ^(?(?=#).*\n(.)|(?(?=.#).*\n.(.)|(?(?=..#).*\n..(.)|(?(?=...#).*\n...(.)|(?(?=^....#).*\n....(.)|(?(?=^.{5}#).*\

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

匹配字符没有固定位置

例如。如果#符号位于第一行,则与下一行的字符值相匹配

这将给出:2

X#ZEAKBLA
123456789
这将给出:7

XIZEAK#LA
123456789
下面是一个使用条件的非常复杂的版本:

^(?(?=#).*\n(.)|(?(?=.#).*\n.(.)|(?(?=..#).*\n..(.)|(?(?=...#).*\n...(.)|(?(?=^....#).*\n....(.)|(?(?=^.{5}#).*\n.{5}(.)|(?(?=^.{6}#).*\n.{6}(.)|#))))))).*$
基本上,它所做的是首先检查行的开头,然后启动一个多级条件(if/then/else)

然后,测试任何字符的数量是否增加,从0开始(在本例中,增加到7),然后测试是否匹配

如果满足此条件,它将匹配行的其余部分、换行符以及在上一次测试中找到的相同数量的任何字符,这将使我们处于与上一次测试中的
#
相同的位置

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

如果不满足后跟一个
的n个字符的匹配,它将测试下一个在
之前有n+1个字符的其他字符,依此类推

如果最终测试失败,则匹配
#
(满量程版本中不应存在)以使匹配失败

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

编辑

通过将测试外的实际捕获移动到测试外,在匹配其他测线之前,在一定程度上降低了复杂性:

Edit2

有点被这件事缠住了;)

这里有一个更简单的版本。(我已将索引字符替换为
(ASCII 254),主要用于在正则表达式中进行注释,但也用于提高可读性(imo)

如注释中所述,它在所有级别中匹配匹配后匹配任意字符,消除了对每个级别字符特定匹配的需要

这也使得在测试中添加级别变得非常容易

.

这是一个使用条件的非常复杂的版本:

^(?(?=#).*\n(.)|(?(?=.#).*\n.(.)|(?(?=..#).*\n..(.)|(?(?=...#).*\n...(.)|(?(?=^....#).*\n....(.)|(?(?=^.{5}#).*\n.{5}(.)|(?(?=^.{6}#).*\n.{6}(.)|#))))))).*$
基本上,它所做的是首先检查行的开头,然后启动一个多级条件(if/then/else)

然后,测试任何字符的数量是否增加,从0开始(在本例中,增加到7),然后测试是否匹配

如果满足此条件,它将匹配行的其余部分、换行符以及在上一次测试中找到的相同数量的任何字符,这将使我们处于与上一次测试中的
#
相同的位置

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

如果不满足后跟一个
的n个字符的匹配,它将测试下一个在
之前有n+1个字符的其他字符,依此类推

如果最终测试失败,则匹配
#
(满量程版本中不应存在)以使匹配失败

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

编辑

通过将测试外的实际捕获移动到测试外,在匹配其他测线之前,在一定程度上降低了复杂性:

Edit2

有点被这件事缠住了;)

这里有一个更简单的版本。(我已将索引字符替换为
(ASCII 254),主要用于在正则表达式中进行注释,但也用于提高可读性(imo)

如注释中所述,它在所有级别中匹配匹配后匹配任意字符,消除了对每个级别字符特定匹配的需要

这也使得在测试中添加级别变得非常容易


.

正则表达式和切片?作为一个易于实现的解决方案,对于复杂性检查,同一个问题的最佳答案来自@ClasG-惊人

<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>
试试看
“123#4678911”

1943215927

函数myFunction(){ var str=“123#4678911”; var otherstr=“1943215927”; var n=str.search(/#/); //返回3,从0开始 var res=其他str.slice(n,n+1); //在3和4位置之间剪切所有其他STR document.getElementById(“demo”).innerHTML=“位置开始于[0]:”+n; document.getElementById(“demo2”).innerHTML=“二维字符串中的数字:”+res; }
正则表达式和切片?作为一个易于实现的解决方案,对于复杂性检查,同一个问题的最佳答案来自@ClasG-惊人

<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>
试试看
“123#4678911”

1943215927

函数myFunction(){ var str=“123#4678911”; var otherstr=“1943215927”; var n=str.search(/#/); //返回3,从0开始 var res=其他str.slice(n,n+1); //在3和4位置之间剪切所有其他STR document.getElementById(“demo”).innerHTML=“位置开始于[0]:”+n; document.getElementById(“demo2”).innerHTML=“二维字符串中的数字:”+res; }
您真的需要使用regexp执行此操作吗?我想regexp可以为您提供索引,使用此索引您可以直接访问所需的字符(
string.charAt(index)
等),这取决于regex的风格。我想这可以通过递归实现,递归在某些方面是可用的。(标准)正则表达式不能计数。不管怎么说,使用非标准正则表达式可能效率很低。您可以使用IndexOf来查找字符,然后修剪另一个字符串以获得值。我知道我可以很容易地用代码来解决这个问题,但是现在,为了好玩,我尝试只用正则表达式来解决它。你真的需要用正则表达式来解决这个问题吗?我