【问题标题】:Regex to replace all leading tab characters, each one with a single space [duplicate]正则表达式替换所有前导制表符,每个制表符都有一个空格[重复]
【发布时间】:2020-11-25 06:33:45
【问题描述】:

我正在寻找一个正则表达式来用一个空格替换所有前导制表符(每个前导制表符一个空格。

// input text with two leading tab characters and two tab characters elsewhere in the text
var input="     Some text       containing tabs";

// A:
console.log(input.replace(/\t/g, "LEADING_TAB_"));  
// prints: "LEADING_TAB_LEADING_TAB_Some textLEADING_TAB_LEADING_TAB_containing tabs"

// B:
console.log(input.replace(/\t/, "LEADING_TAB_"));  
// prints: "LEADING_TAB_   Some text       containing tabs"

// C:
console.log(input.replace(/^(\t)*/, "LEADING_TAB_"));  
// prints: "LEADING_TAB_Some text      containing tabs"

// D:
console.log(input.replace(/\t/gy, "LEADING_TAB_"));  
// prints: "LEADING_TAB_LEADING_TAB_Some text      containing tabs"

// E:
console.log(input.replace(/\t/y, "LEADING_TAB_"));  
// prints: "LEADING_TAB_   Some text       containing tabs"

在 js fiddle 中看到这个:https://jsfiddle.net/onebcvu4/2/

答案 D 对我有用。

input.replace(/\t/gy, " ")

但我真的不明白为什么。尤其是因为,根据MDN documentation,全局 (G) 标志在与粘性标志一起使用时应该被忽略。

定义为粘性和全局的正则表达式忽略全局标志。

任何人都可以澄清或提供另一种可行的解决方案吗?

【问题讨论】:

  • 我必须记住 gy 的把戏。不错....
  • 哇真的很高兴找到这个。偶尔,封闭的问题四处寻找,可以有很大的回报,这肯定是那些时代之一。在阅读此问答之前,我什至不知道 y 标志存在,然而,它似乎正是我想要的。

标签: javascript regex


【解决方案1】:

您的答案 D 有效(并且非常聪明),因为 gy 不是排他性的,但认为它们会是合理的。完整的详细信息在规范herehere 中,但基本上g 使replace 只要有匹配就重复,y 表示 A) 表达式仅匹配 lastIndex (默认为 0),并且 B) lastIndex 未更新。因此,您在lastIndex 处重复匹配\t 并替换它,直到在lastIndex 处用完\t。非常聪明。

如果你不想用那个,你也可以换个方式,正面看后面:

const result = input.replace(/(?:^\t|(?<=^\t*)\t)/g, " ");

现场示例:

const input = "\t\tSome text\t\tcontaining tabs";
const result = input.replace(/(?:^\t|(?<=^\t*)\t)/g, " ");

console.log(JSON.stringify(result));

或者,如果您可以将回调传递给 replace,它会更简单,并且不需要后视(这是相对较新的,ES2018):匹配所有前导 \t 字符并用一串空格替换长度相同:

const result = input.replace(/^(\t+)/, match => " ".repeat(match.length));

现场示例:

const input = "\t\tSome text\t\tcontaining tabs";
const result = input.replace(/^(\t+)/, match => " ".repeat(match.length));
console.log(JSON.stringify(result));

【讨论】:

猜你喜欢
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2013-01-10
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
相关资源
最近更新 更多