正则表达式:查找字符串中第n个字符前或在第n个字符处的空格

5

我需要在字符串中找到第n个字符或之前的空格。

例如,假设n为20,在字符串中:

 Find one space in the right place
^         ^       ^ ^
0         10      M 20

在这种情况下,h位于第20个位置,我需要找到第20个位置之前的第一个空格,在第18个位置的单词“the”之前,刚好在M上方的那个。

我可以使用正向回溯查找第n个字符,例如:

(?<=.{80}).

但是我需要一直往回找,直到找到第一个空格字符,我不知道怎么做。
我正在使用不支持可变长度回顾的notepad++,如果可能的话,我希望能够使用正则表达式在notepad++中进行操作。谢谢。

为什么要使用正则表达式?只需要线性扫描就可以工作,而且速度更快。 - nhahtdh
因为我没有使用编程语言。 - Gabber
正则表达式用于查找...您所说的查找是什么意思?您想要找到第20个字符之前最后一个空格的位置吗? - FailedDev
我需要它作为替换的目的,我打算用notepad++将那个空格替换成其他东西,因此我只需要在搜索框中使用正则表达式即可。 - Gabber
2个回答

6
您可以使用此正则表达式(在引号内但不包括引号):
"^.{1,19} "

请注意末尾的空格。
我已经使用Notepad++ 6.1.5进行了测试(发布时的最新版本)。根据功能列表,该正则表达式与PCRE兼容(后向查找有效,但仅限于固定宽度)。上面的正则表达式在我当前拥有的旧版本(Notepad++ 5.9)上无法工作。
由于您需要将空格替换为其他内容,因此您可能需要使用捕获组来保留文本并仅替换空格(在引号内但不包括引号内部)。
"^(.{1,19}) " (Find)
"\1replace_space" (Replace)

注意:正则表达式将在第20个字符之前或第20个字符处搜索空格。如果您希望空格严格出现在第20个字符之前,请将19更改为18。

@Ωmega:你可能是对的(所以我正在向OP澄清边界情况)。无论如何,我需要修改正则表达式为19或18。我更喜欢空格而不是\s - nhahtdh
这适用于{1,19},这是一个简单而好的解决方案,很抱歉我自己没有想到 :) - Gabber
这个解决方案很好,但对于超过最大字符数(在您的答案中为19)的单词会出现问题。如果要解决这个问题,可以使用这个正则表达式(^[^ ]{20})?(?(1)|^.{1,20} ),它会根据空格或任何其他字符来分割字符串。https://regex101.com/r/RkHel3/1 - Ulysse BN
@UlysseBN:这取决于具体的要求,在问题中没有提到这种情况。个人认为,如果没有明显的截断标志,截断单词可能会导致无意义的单词或更糟糕的情况。 - nhahtdh
@nhahtdh 我发现你提供的链接与此处讨论的问题无关。如果您想要截断一个工作,您可以明确地使用一些键来指示您正在向用户做什么。我认为在您的答案中包含我的评论并不相关,但我发现它可能会有所帮助。这使我能够创建此实用程序:https://gist.github.com/BuonOmo/c9d89653e111b7fc333087a1d9e6ceb7 - Ulysse BN
显示剩余5条评论

-1

对于n = 20,使用正则表达式(\s)\S*.(?<=^.{20})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接