天道酬勤,学无止境

On Which Line Number Was the Regex Match Found?

I would like to search a .java file using Regular Expressions and I wonder if there is a way to detect one what lines in the file the matches are found.

For example if I look for the match hello with Java regular expressions, will some method tell me that the matches were found on lines 9, 15, and 30?

标签

评论

Possible... with Regex Trickery!

Disclaimer: This is not meant to be a practical solution, but an illustration of a way to use an extension of a terrific regex hack. Moreover, it only works on regex engines that allow capture groups to refer to themselves. For instance, you could use it in Notepad++, as it uses the PCRE engine—but not in Java.

Let's say your file is:

some code
more code
hey, hello!
more code

At the bottom of the file, paste :1:2:3:4:5:6:7, where : is a delimiter not found in the rest of the code, and where the numbers go at least as high as the number of lines.

Then, to get the line of the first hello, you can use:

(?m)(?:(?:^(?:(?!hello).)*(?:\r?\n))(?=[^:]+((?(1)\1):\d+)))*.*hello(?=[^:]+((?(1)\1)+:(\d+)))

The line number of the first line containing hello will be captured by Group 2.

  • In the demo, see Group 2 capture in the right pane.
  • The hack relies on a group referring to itself. In the classic @Qtax trick, this is done with (?>\1?). For diversity, I used a conditional instead.

Explanation

  • The first part of the regex is a line skipper, which captures an increasing amount of the the line counter at the bottom to Group 1
  • The second part of the regex matches hello and captures the line number to Group 2
  • Inside the line skipper, (?:^(?:(?!hello).)*(?:\r?\n)) matches a line that doesn't contain hello.
  • Still inside the line skipper, the (?=[^:]+((?(1)\1):\d+)) lookahead gets us to the first : with [^:]+ then the outer parentheses in ((?(1)\1):\d+)) capture to Group 1... if Group 1 is set (?(1)\1) then Group 1, then, regardless, a colon and some digits. This ensures that each time the line skipper matches a line, Group 1 expands to a longer portion of :1:2:3:4:5:6:7
  • The * mataches the line skipper zero or more times
  • .*hello matches the line with hello
  • The lookahead (?=[^:]+((?(1)\1)+:(\d+))) is identical to the one in the line skipper, except that this time the digits are captured to Group 2: (\d+)
  • -

Reference

  • Qtax trick (recently awarded an additional bounty by @AmalMurali)
  • Replace a word with the number of the line on which it is found

If you are using a Unix based OS / terminal, you could use sed:

sed -n '/regex/=' file

(from this StackOverflow response)

There are no methods in Java that will do it for you. You must read the file line-by-line and check for a match on each line. You can keep an index of the lines as you read them and do whatever you want with that index when a match is found.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 正则表达式可以返回找到匹配项的行号吗?(Can a Regex Return the Number of the Line where the Match is Found?)
    问题 在文本编辑器中,我想用找到该单词的行号的编号替换给定的单词。 正则表达式可以做到这一点吗? 回答1 递归、自引用组(Qtax 技巧)、反向 Qtax 或平衡组 介绍 在输入的底部添加一个整数列表的想法类似于一个著名的数据库黑客(与正则表达式无关),其中一个连接到一个整数表。 我的原始答案使用了@Qtax 技巧。 当前的答案使用递归、Qtax 技巧(直接或反向变化)或平衡组。 是的,这是可能的......有一些警告和正则表达式技巧。 此答案中的解决方案旨在作为展示一些正则表达式语法的工具,而不是要实现的实际答案。 在您的文件末尾,我们将粘贴以唯一分隔符开头的数字列表。 对于这个实验,附加的字符串是:1:2:3:4:5:6:7这是一种类似于使用整数表的著名数据库黑客的技术。 对于前两个解决方案,我们需要一个使用正则表达式风格的编辑器,允许递归(解决方案 1)或自引用捕获组(解决方案 2 和 3)。 我想到了两个:Notepad++ 和 EditPad Pro。 对于第三个解决方案,我们需要一个支持平衡组的编辑器。 这可能会限制我们使用 EditPad Pro 或 Visual Studio 2013+。 输入文件: 假设我们正在搜索pig并希望将其替换为行号。 我们将使用它作为输入: my cat dog my pig my cow my mouse :1:2:3:4:5:6:7
  • 正则表达式在csv中查找丢失的双引号(Regex to find missing double quote in csv)
    问题 我们正在处理包含非闭合双引号条目的 csv 文件。 这些会炸毁 csv 解析器,所以我试图组合一个正则表达式来识别这些行,以便我们可以在尝试处理它们之前将它们从文件中删除。 在以下示例中,csv 解析器到达第 2 行并在尝试关闭标记之前包含第 3 行中第一个双引号之前的所有内容,然后由于“关闭”双引号之后有非空白字符而爆炸下一个逗号。 Example Line 1, some data,"good line",processes fine,happy Example Line 2, some data,"bad line, processes bad,unhappy Example Line 3,一些数据,“good line”,死在这里,不开心 我正在尝试执行以下操作: .*,"[^(",)]*[\r\n] 这个想法是找到一行任何后跟 ," 的单行,而没有 " 的实例,该实例在该行结束之前。 但是,序列的否定不起作用。 像这样的事情是如何完成的? 笔记: 由于人们一直建议基本上检查偶数个双引号,因此值得注意的是,单个双引号 csv 条目可能包含一个独立的双引号(例如 ...,"Measurement: 1' 2"",...) . 回答1 您可以使用: int count = str.length() - str.replaceAll("\\"","").length()
  • Hive RegexSerDe 多行日志匹配(Hive RegexSerDe Multiline Log matching)
    问题 我正在寻找一个正则表达式,它可以以以下形式提供给 Hive QL 的“创建外部表”语句 "input.regex"="the regex goes here" 条件是 RegexSerDe 必须读取的文件中的日志格式如下: 2013-02-12 12:03:22,323 [DEBUG] 2636hd3e-432g-dfg3-dwq3-y4dsfq3ew91b Some message that can contain any special character, including linebreaks. This one does not have a linebreak. It just has spaces on the same line. 2013-02-12 12:03:24,527 [DEBUG] 265y7d3e-432g-dfg3-dwq3-y4dsfq3ew91b Some other message that can contain any special character, including linebreaks. This one does not have one either. It just has spaces on the same line. 2013-02-12 12:03:24,946 [ERROR] 261rtd3e-432g
  • ASCII“图像”中的“垂直”正则表达式匹配("vertical" regex matching in an ASCII "image")
    问题 注意:这是一个关于现代正则表达式的可能性的问题。 这不是使用其他方法解决此问题的最佳方法。 它的灵感来自较早的问题,但该问题不仅限于正则表达式。 问题 在 ASCII“图像”/art/map/string 中,例如: ....X....... ..X..X...X.... X.X...X..X..... X....XXXXXX..... X..XXX........... .....X.......... ..............X ..X...........X.... ..X...........X....X... ....X..... 我想找到一个简单的三个X的垂直线形成: X X X 图像中的行数是可变的,每行的宽度也是可变的。 问题 使用正则表达式(PCRE/PHP、Perl、.NET 或类似的)是否可以: 确定是否存在这样的结构计算此类编队的数量/匹配所有编队的起点(上例中的 4 个) 回答1 回答问题 1 要回答第一个问题,可以使用: (?xm) # ignore comments and whitespace, ^ matches beginning of line ^ # beginning of line (?: . # any character except \n (?= # lookahead .*+\n # go to next line (
  • Java 正则表达式
    Java 正则表达式 正则表达式定义了字符串的模式。可以用来搜索、编辑或处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。 正则表达式实例 java.util.regex 包主要包括以下三个类: Pattern 类: pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。Matcher 类: Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。PatternSyntaxException: PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。 以下实例中使用了正则表达式 .nowcoder. 用于查找字符串中是否包了 nowcoder子串: import java.util.regex.*; class RegexExample1{ public static void main(String args[]){ String content = "I am coder " +
  • 如何使'git diff'忽略注释(How to make 'git diff' ignore comments)
    问题 我正在尝试生成在特定提交中已更改的文件的列表。 问题在于,每个文件在文件顶部的注释中都有版本号-并且由于此提交引入了新版本,因此意味着每个文件都已更改。 我不在乎更改的注释,因此我想让git diff忽略所有匹配^\s*\*.*$ ,因为这些都是注释(/ * * /的一部分)。 我找不到任何方法告诉git diff忽略特定的行。 我已经尝试设置textconv属性,以使Git在比较文件之前将文件传递给sed,以便sed可以删除有问题的行-这样做的问题是git diff --name-status实际上并不对文件,只比较哈希值,当然所有哈希值都已更改。 有没有办法做到这一点? 回答1 git diff -G <regex> 并指定与您的版本号行不匹配的正则表达式。 回答2 这是一个对我来说很好的解决方案。 我已经在git (log|diff) -G<regex>选项上写了解决方案和一些其他缺少的文档。 它基本上使用与以前的答案相同的解决方案,但是专门用于以*或#开头的注释,有时是*之前的空格...但它仍然需要允许#ifdef , #include等更改。 。 -G选项似乎不支持向前看和-G ,也不? 通常,我在使用*时也遇到了问题。 +似乎运行良好。 (注意,已在Git v2.7.0上测试) 多行注释版本 git diff -w -G'(^[^\*# /])|(^#\w)|(^
  • 在输入中的任意位置找到两个字符串的正则表达式(Regular expression to find two strings anywhere in input)
    问题 如何编写正则表达式以匹配两个给定的字符串,在字符串的任何位置? 例如,如果我搜索cat和mat ,则应匹配: The cat slept on the mat in front of the fire. At 5:00 pm, I found the cat scratching the wool off the mat. 无论这些字符串之前是什么。 回答1 /^.*?\bcat\b.*?\bmat\b.*?$/m 使用m修饰符(可确保开始/结束元字符在换行符上匹配,而不是在字符串的开始和结尾处匹配): ^匹配行首.*? 在...之前匹配线路上的任何内容... \b匹配单词边界第一次出现的单词边界(如@codaddict所述) 然后是字符串cat和另一个单词的边界; 请注意,下划线被视为“单词”字符,因此_cat_将不匹配*; .*? :之前的任何字符... 边界, mat ,边界.*? :之前的所有剩余字符... $ :行的结尾。 使用\b确保指定的单词不是较长单词的一部分很重要,并且使用非贪婪通配符( .*? )与贪婪( .* )也很重要,因为后者会在诸如“一只猫在垫子下面,在它下面。” (它将匹配最后一次出现的“ cat”而不是第一次出现的猫。) *如果要匹配_cat_ ,则可以使用: /^.*?(?:\b|_)cat(?:\b|_).*?(?:\b|_)mat(
  • 高效匹配 Python 中的多个正则表达式(Efficiently match multiple regexes in Python)
    问题 当您有正则表达式时,词法分析器很容易编写。 今天我想用 Python 编写一个简单的通用分析器,并想出了: import re import sys class Token(object): """ A simple Token structure. Contains the token type, value and position. """ def __init__(self, type, val, pos): self.type = type self.val = val self.pos = pos def __str__(self): return '%s(%s) at %s' % (self.type, self.val, self.pos) class LexerError(Exception): """ Lexer error exception. pos: Position in the input line where the error occurred. """ def __init__(self, pos): self.pos = pos class Lexer(object): """ A simple regex-based lexer/tokenizer. See below for an example of usage. """ def
  • 使用javascript验证电话号码(Validate phone number using javascript)
    问题 我正在尝试使用JavaScript验证电话号码,例如123-345-3456和( (078)789-8908 。 这是我的代码 function ValidateUSPhoneNumber(phoneNumber) { var regExp = /^(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}/; var phone = phoneNumber.match(regExp); if (phone) { alert('yes'); return true; } alert('no'); return false; } 我正在使用ValidateUSPhoneNumber('123-345-34567')测试该函数,该函数在最后一个连字符之前有5位数字,根据正则表达式无效。 但是该函数返回true。 谁能解释为什么? 回答1 用于验证电话号码的JavaScript: function phonenumber(inputtxt) { var phoneno = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/; if(inputtxt.value.match(phoneno)) { return true; } else { alert("message"); return false;
  • 正则表达式选择双引号之外的字符(Regex to pick characters outside of pair of quotes)
    问题 我想找到一个正则表达式,它将排除引号集之外的所有逗号。 例如: 'foo' => 'bar', 'foofoo' => 'bar,bar' 这将在'bar',之后'bar',第1行中选择单个逗号'bar', 我不太在乎单引号还是双引号。 有没有人有任何想法? 我觉得预读应该可以实现,但是我的regex fu太弱了。 回答1 这将匹配直至(包括)第一个非引号“,”的任何字符串。 那是你想要的吗? /^([^"]|"[^"]*")*?(,)/ 如果您想全部使用(并以举个例子说这不可能的人作为反例),则可以编写: /(,)(?=(?:[^"]|"[^"]*")*$)/ 这将匹配所有这些。 因此 'test, a "comma,", bob, ",sam,",here'.gsub(/(,)(?=(?:[^"]|"[^"]*")*$)/,';') 替换所有的逗号不是里面用分号报价,并产生: 'test; a "comma,"; bob; ",sam,";here' 如果您需要它在换行符之间工作,只需添加m(多行)标志。 回答2 以下正则表达式将匹配双引号之外的所有逗号, ,(?=(?:[^"]*"[^"]*")*[^"]*$) 演示 或(仅PCRE) "[^"]*"(*SKIP)(*F)|, "[^"]*"匹配所有双引号块。也就是说,在此buz,"bar,foo"输入仅此正则表达式匹配
  • Regex.IsMatch 方法正则表达式在输入字符串中是否找到匹配项C#
    Regex.IsMatch 方法 定义 命名空间: System.Text.RegularExpressions 程序集: System.Text.RegularExpressions.dll, System.dll, netstandard.dll 指示正则表达式在输入字符串中是否找到匹配项。 重载 IsMatch(String) 指示 Regex 构造函数中指定的正则表达式在指定的输入字符串中是否找到了匹配项。 IsMatch(String, Int32) 指示 Regex 构造函数中指定的正则表达式在指定的输入字符串中,从该字符串中的指定起始位置开始是否找到了匹配项。 IsMatch(String, String) 指示所指定的正则表达式在指定的输入字符串中是否找到了匹配项。 IsMatch(String, String, RegexOptions) 指示所指定的正则表达式是否使用指定的匹配选项在指定的输入字符串中找到了匹配项。 IsMatch(String, String, RegexOptions, TimeSpan) 指示所指定的正则表达式是否使用指定的匹配选项和超时间隔在指定的输入字符串中找到了匹配项。 IsMatch(String) 指示 Regex 构造函数中指定的正则表达式在指定的输入字符串中是否找到了匹配项。 C#复制 public bool IsMatch
  • 将文本文件解析为表格数据进行处理(Parsing text file to tabular data for processing)
    问题 手头的问题是使用python以表格形式解析特定数据。一小部分数据如下所示 Statistics indicator:0x222235 number of records = 3 records[0] value one = 2 value two = 5 blocks = 2 block[0] { some irrelevant data.... value three = 4 bytes } block[1]{ some irrelevant data... value three = 6 bytes } records[1] value one = 3 value two = 5 blocks = 1 block[0] { some irrelevant data.... value three = 4 bytes } records[2] value one = 7 value two = 6 blocks = 2 block[0] { some irrelevant data.... value three = 3 bytes } block[1]{ some irrelevant data... value three = 4 bytes } Statistics indicator:0x135256 number of records = 2 records[0]
  • Can a Regex Return the Number of the Line where the Match is Found?
    In a text editor, I want to replace a given word with the number of the line number on which this word is found. Is this is possible with Regex?
  • 计算文件中某个模式的出现次数(即使在同一行上)(Count number of occurrences of a pattern in a file (even on same line))
    问题 搜索文件中字符串出现的次数时,通常使用: grep pattern file | wc -l 但是,由于grep的工作方式,每行仅发现一个事件。 我如何搜索字符串出现在文件中的次数,而不管它们是位于同一行还是位于不同行? 另外,如果我要搜索正则表达式模式而不是简单的字符串怎么办? 我该如何计算,甚至更好地将每场比赛打印在新的一行上? 回答1 要计算所有出现的次数,请使用-o 。 试试这个: echo afoobarfoobar | grep -o foo | wc -l 当然还有man grep (: 更新 有人建议只使用grep -co foo而不是grep -o foo | wc -l grep -o foo | wc -l 。 别。 此快捷方式并非在所有情况下都有效。 手册页说: -c print a count of matching lines 这些方法的差异如下所示: 1。 $ echo afoobarfoobar | grep -oc foo 1 一旦在行( a{foo}barfoobar )中找到匹配a{foo}barfoobar ,搜索就会停止。 仅检查了一行并且匹配了该行,因此输出为1 。 实际上-o在这里被忽略了,您可以只使用grep -c来代替。 2。 $ echo afoobarfoobar | grep -o foo foo foo $ echo
  • 正则表达式,用于匹配/替换JavaScript注释(多行和内联)(RegEx for match/replacing JavaScript comments (both multiline and inline))
    问题 我需要使用JavaScript RegExp对象从JavaScript源中删除所有JavaScript注释。 我需要的是RegExp的模式。 到目前为止,我发现了这一点: compressed = compressed.replace(/\/\*.+?\*\/|\/\/.*(?=[\n\r])/g, ''); 此模式适用于以下情况: /* I'm a comment */ 或用于: /* * I'm a comment aswell */ 但似乎不适用于内联: // I'm an inline comment 我不是RegEx及其模式的专家,所以我需要帮助。 另外,我想有一个RegEx模式,该模式将删除所有这些类似HTML的注释。 <!-- HTML Comment //--> or <!-- HTML Comment --> 还有那些条件HTML注释,可以在各种JavaScript来源中找到这些注释。 谢谢。 回答1 尝试这个, (\/\*[\w\'\s\r\n\*]*\*\/)|(\/\/[\w\s\']*)|(\<![\-\-\s\w\>\/]*\>) 应该管用 :) 回答2 注意:Regex不是词法分析器或解析器。 如果您有一些奇怪的情况,需要从字符串中解析出一些奇怪的嵌套注释,请使用解析器。 在其他98%的时间里,此正则表达式都可以工作。 我对嵌套的星号
  • JAVA 正则表达式 (超详细)
    在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包。   可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式。正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性。在Unix世界里,正则表达式几乎没有什么限制,可肯定的是,它应用非常之广泛。   正则表达式的引擎已被许多普通的Unix工具所实现,包括grep,awk,vi和Emacs等。此外,许多使用比较广泛的脚本语言也支持正则表达式,比如Python,Tcl,JavaScript,以及最著名的Perl。   我很早以前就是个Perl方面的***,如果你和我一样话,你也会非常依赖你手边的这些强大的text-munging工具。近几年来,像其他程序开发者一样,我也越来越关注Java的开发。   Java作为一种开发语言,有许多值得推荐的地方,但是它一直以来没有自带对正则表达式的支持。直到最近,借助于第三方的类库,Java开始支持正则表达式,但这些第三方的类库都不一致、兼容性差,而且维护代码起来很糟糕。这个缺点,对我选择Java作为首要的开发工具来说,一直是个巨大的顾虑之处。   你可以想象,当我知道Sun的Java JDK 1.40版本包含了java.util.regex(一个完全开放
  • 正则表达式 IF THEN ELSE 语句(REGEX IF THEN ELSE Statement)
    问题 我需要编写一个让我摸不着头脑的正则表达式。 本质上,我有一列数据,其中包含以下值: ACME Corp 123 Corp 742 ACME Random Text Broadway 1785 FB 我想要做的是寻找术语ACME和BROADWAY 。 如果存在任何一个,请保留那个并且只保留那个。 如果两者都不存在,则保留整个字符串。 所以上面的那一栏会变成: ACME ACME Random Text Broadway 那有意义吗? 回答1 简短的 这让我摸不着头脑。 我确定单独的正则表达式不是解决这个问题的最佳方法,但是,这是您的解决方案。 代码 请参阅此处使用的此代码 正则表达式 ^.*?((?(?=.*?(\b(?:broadway|acme)\b).*?)\2|.*)).*?$ 代换 第 1 组如下。 您可以改为从匹配数组中收集第 1 组变量,但如果要替换,可以使用以下命令 $1 结果 注意:我添加了另一个字符串作为测试,以确保如果任何一个单词放在一行的中间,它仍然会抓住它。 输入 ACME Corp 123 Corp 742 ACME Some ACME some Random Text Broadway 1785 FB 输出 ACME ACME ACME Random Text Broadway 解释 使用不区分大小写的i和多行m标志: ^在行首断言位置.*
  • C++ 中的正则表达式问题(Issue with regular expressions in C++)
    问题 我尝试使用以下正则表达式,它已经在C#和C++中有效,但在C++不起作用。 std::regex r = std::regex("([^%]*(%[.[0-9]*]?[a-z])*)*", std::regex::extended); 它设法匹配多个字符串并正确拒绝其他字符串,但卡在字符串“%d 比可用 pbn % f %d 小”上(真的卡住了 - 没有错误),它应该拒绝(因为有一个 % 不是立即前面有一个合法的后缀)。 使用std::regex r = std::regex("(([^%]*)(%(\\.([0-9]*))?[az])*)*"); 表现出与我之前描述的完全相同的行为。 (我假设这两个正则表达式是等效的——只有一个是像 C# 使用的规范形式,第二个是像 c++ 默认的 ECMAScript) 我不确定是什么问题。 此外,我想将整个字符串与该模式匹配,以便仅当整个字符串作为一个整体匹配时才匹配。 所以我想为此使用regex_match 。 我在 C++ 中使用以下代码: if (std::regex_match(str, r)) 此外,在 C# 中,我使用以下代码来执行该检查(整个字符串作为一个整体匹配): Regex^ r = gcnew Regex("([^%]*(%[.[0-9]*]?[a-z])*)*", RegexOptions::IgnoreCase
  • 需要正则表达式来匹配多行,直到在公共分隔符之间找到匹配(Need Regex to match multiple lines until Match is found between common delimiters)
    问题 我正在尝试编写一个正则表达式,它将从日志文件中返回多行匹配项。 使用下面的示例——我想匹配整个“事务”,它以与日志中所有其他事务(开始和结束)相同的文本开始和结束。 但是 - 在这些行之间有一个自定义标识符 - 在这种情况下是一个电子邮件地址,它将一个交易与另一个交易区分开来。 Start of a transaction. random line 1. random line 2. email1@gmail.com End of a transaction. Start of a transaction. random line 1. random line 2. email1@yahoo.com random line 3. End of a transaction. 这是我的开始: ^Start(.*?)\n(((.*?)(email1\@gmail\.com)(.*?)|(.*?))\n){1,}End (.*?)\n 本质上 - 我想说:从“开始”开始——并匹配所有行直到“结束”行,但仅当其中一行包含特定电子邮件地址时才返回匹配项。 现在——我的正则表达式将整个日志文件视为单个匹配项,因为大概第 1 行包含一个“开始”,第 X 行包含一个“结束”,并且在其间的数百行中——它们是电子邮件的匹配项. 此外 - 应用程序是 Powershell,如果重要的话,将使用
  • 正则表达式更改缩进级别中的空格数(Regex to change the number of spaces in an indent level)
    问题 假设你有一些看起来像这样的行 1 int some_function() { 2 int x = 3; // Some silly comment 等等。 缩进是用空格完成的,每个缩进是两个空格。 您想将每个缩进更改为三个空格。 简单的正则表达式 s/ {2}/ /g 对您不起作用,因为这会更改一些非缩进空格; 在这种情况下,它会将// Some silly comment之前的两个空格更改为三个空格,这是不希望的。 (如果在行的后端对齐表格或注释,情况会变得更糟。) 你不能简单地使用 /^( {2})+/ 因为你会用什么来代替它? 我不知道有什么简单的方法可以找出+在正则表达式中匹配了多少次,所以我们不知道要插入多少更改的缩进。 你总是可以一行一行地剪掉缩进,测量它们,建立一个新的缩进字符串,然后把它钉在线上,但如果有正则表达式会简单得多。 是否有正则表达式来替换上述缩进级别? 回答1 在某些正则表达式风格中,您可以使用回顾: s/(?<=^ *) / /g 在所有其他风格中,您可以反转字符串,使用前瞻(所有风格都支持)并再次反转: s/ (?= *$)/ /g 回答2 我需要将缩进的空格量减半。 也就是说,如果缩进是 4 个空格,我需要将其更改为 2 个空格。 我想不出正则表达式。 但是,谢天谢地,其他人做到了: //search for ^( +)\1 /