具有已知开始和结束索引的两个字符位置之间的正则表达式

时间:2017-02-08 18:19:13

标签: javascript regex sed

regex中,一般来说,有没有办法在两个线位置之间选择数据?在阅读regex几天之后,我甚至不确定正确的术语(字符/行位置,索引,列?),但我的意思是......

选择两个索引之间的数据,即^.{4}^.{7}之间的数据,例如:

TESTINGREGEX
ISNTTHEBEST!

TESTINGREGEXCANBEFUN
ISNTTHEBEST!ANDFARFROMFUN

我正在寻找的结果将是:

TESTREGEX
ISNTBEST!

TESTREGEXCANBEFUN
ISNTBEST!ANDFARFROMFUN

我想知道,所以我可以了解它是否可能,如何实现它?我非常熟悉使用其他工具执行此操作的其他方法,但我很好奇如何使用regex实现此目的。

我尝试过与非捕获群体一起工作,并想知道我是否因为我试图在atom编辑器中找到并使用此正则表达式而受到限制。取代regex功能(成为Avoiding Common Pitfalls的受害者),所以我希望得到一些建议,以扩大我的知识并尝试。我猜测javascript和/或sed样式regex答案是可以接受的......真的有什么帮助!

编辑: 来自Mark's answer.{3}(?=.{5}$)适用于我以及我在OP中提供的示例文本。知道什么时候可以从$行结束计算是一件好事。但我意识到我实际上需要相反的......我需要从^行开始算起来。这是不可能的; re:关于没有支持lookbehind的评论?

3 个答案:

答案 0 :(得分:1)

正则表达式^(.{4}).{3}(.{5})$(以JavaScript方言表示,但其中使用的功能非常常见)将为您提供两个捕获组,您可以将它们组合起来以获得您描述的输出:



function test(str) {
  var match = str.match(/^(.{4}).{3}(.{5})$/);
  console.log(str, '=>', match[1] + match[2]);
}
test("TESTINGREGEX");
test("ISNTTHEBEST!");




如果行的长度不同,并且您希望在结束之后忽略所有内容,则只需删除$断言即可。

答案 1 :(得分:1)

只有正则表达式才有可能,而不是在javascript中。正则表达式(?<=^.{4}).+(?=.{5}$)用于捕获第4个字母和第5个字母到最后一个字母之间的组。由于javascript不支持正面外观,因此除了简单的.replace(regex, "")之外,您还必须使用一些javascript来删除这些字符。

javascript中可能的下一个最接近的正则表达式是.{3}(?=.{5}$),它在第5个到最后一个字母之前匹配3个字符。

如果您想在javascript中使用纯正则表达式来捕获字符串开头后的几个字符,那将是不可能的。

答案 2 :(得分:0)

如果目的是使文本在两个字符偏移量之间,则正则表达式会显得过大。只需使用slice

function exclude(str, i, j) {
    return str.slice(0, i) + str.slice(j);
}
console.log(exclude("TESTINGREGEX", 4, 7));
console.log(exclude("ISNTTHEBEST!", 4, 7));

如果您确实需要使用正则表达式执行此操作,请按照以下步骤操作:

function exclude(str, i, j) {
    return str.replace(new RegExp(`^(.{${i}})(.{${j-i}})`), "$1");
}
console.log(exclude("TESTINGREGEX", 4, 7));
console.log(exclude("ISNTTHEBEST!", 4, 7));