【问题标题】:Regex excluding text between parentheses in Notepad++ search & replace正则表达式在 Notepad++ 搜索和替换中排除括号之间的文本
【发布时间】:2015-06-07 18:17:28
【问题描述】:

组,

这是我的第一篇文章。我喜欢使用 Notepad++ 进行 cnc 程序 g-code 编辑。有时,程序会包含单词之间没有空格的文本。注释包含在括号之间。有时行包含 cmets,但大多数时候不包含:

G90G10L2P1X-38.046Y-11.361Z-36.991(G54 B=0)

G90G10L2P1X5.68Y5.69 

G54G00G90X0.0Y-5.0T53

G43H55Z6.0M8 

S300M03

此正则表达式将在所有单词之间添加一个空格,但会跳过以括号结尾的行:

搜索:(.)([A-Z])(?!.*\))

替换:\1 \2\3

到目前为止一切顺利。我想要的是在所有单词之间添加空格,只排除 cmets,而不是像上面那样跳过包含 cmets 的整行。

任何想法或帮助将不胜感激!我一直在玩这个,并在谷歌上搜索了很多,但没有成功。

** 编辑我的帖子以显示更复杂的示例 2015 年 4 月 8 日:

(FILE NAME XY9032.010) 
(SUB PR.321.322.323.327.328.329.325.324)
(** NONSENSE COMMENT TEXT 324 TO SHOW A DIFF POSSIBLE COMB AB 2/25/15 **)
N1(STORE TOP BOSS G55.X)
N2(STORE BOT. BOSS G55.X)
N3(STORE BOT. BOSS G55.Y)
G00G17G40G49G80G90 
G91G28X0Y0Z0.M05 
G90G0B0
N4G90G10L2P5X-38.046Y-11.361Z-37.021(G58 B0 BOTTOM BORES)
N5G90G10L2P6X-23.130Y-11.361Z-44.027(G59 B180 BOTTOM BORE) 
G90G10L2P1X#568Y#569 
G54G00G90X0.0Y-5.0T53
G43H55Z6.0M8 
S300M03
Z.6
N6G01Z.015F50. 
G01Y-7.0F9.0 
G02J7.0F18.0 
G00Z6.0M09 
G91G28X0Y0Z0M05
M1 

这个小正则表达式将找到括号之间的所有文本实例:

(\(.+\))

例如,搜索:

(\(.+\))

替换:

\1****

将在文本文件中的每个括号实例后添加星号。

我只是想不通从本文其他地方描述的更广泛的搜索中排除相同的正则表达式。

这不起作用 - 仍然在括号内添加空格。下划线=空格:

Search: (?!\(.+\))([a-z]-?\d+(?:\.\d+)?)
Replace: $1_

【问题讨论】:

  • 您可能需要添加正则表达式标签。
  • 什么是你的“词”?预期的结果是什么?
  • 在cnc程序中,单词是一个字母后跟数字。
  • 你如何定义一个“词”?
  • 在后面的例子中,G43H55Z6.0M8 应该是这样的:G43 H55 Z6.0 M8

标签: regex notepad++


【解决方案1】:

你可以这样做吗:

查找内容:(?<!\()([a-z]-?\d+(?:\.\d+)?)
替换为:$1_
我使用_ 来可视化空间

使用您的测试用例,它给出:

G90 G10 L2 P1 X-38.046 Y-11.361 Z-36.991 (G54 B=0)

G90 G10 L2 P1 X5.68 Y5.69  

G54 G00 G90 X0.0 Y-5.0 T53 

G43 H55 Z6.0 M8  

S300 M03 

【讨论】:

  • 看起来不错!我会在一个完整的程序文件(数百行)上试一试,然后告诉你结果。
  • @Diedesigner:如果它适合您,请随时将答案标记为已接受 :) 请参阅:stackoverflow.com/help/someone-answers
  • @Diedesigner:它不再起作用了吗?为什么你不接受答案?
  • 在对一些比我的原始帖子样本更复杂的文件进行测试后,我发现解决方案不排除括号之间的文本。我用一个更复杂的例子编辑了我的原始帖子。指定为 N1-N5 的线是被解决方案改变的 cmets。 N6 行也被错误地更改为 F50 和句号之间的空格,如下所示:“F50_”。它应该保持“F50”。
  • 我还提供了不完整的信息来定义“单词”是什么。这是一个定义更好的列表:字母后跟井号,后跟一个或多个数字:X#1 Y#12 Z#123 I#1234 字母后跟点,后跟一个或多个数字:X.1 Y.12 Z.123 I.1234 字母后跟零:X0 Y0 Z0 字母后跟一个或多个数字,后跟点:X1。 Y12。 Z123。 I1234。字母后接一个或多个数字,后接点,后接一个或多个数字:X1.1 Y21.12 Z321.123 I4321.1234
【解决方案2】:

很难确定你真正认为什么是“词”,但使用你的例子和 cmets,我已经把我认为你想要的东西放在一起。无论哪种方式,这都不是你真正的问题。问题是排除 cmets,这确实有效:

搜索:(\(.*?\))|([a-z](?=[-#.\d])([-#]?\d*(\.\d*)?))

替换:$1$2_ [空格下划线]

交替的第一部分,(\(.*?\)),捕获任何 cmets,将它们吞食,这样它们就不会被交替的第二部分匹配

注意:每行末尾都会有一个空格,但在 Notepad++ 菜单上很容易修剪。

【讨论】:

  • 此解决方案有效并回答了我原来的问题。
【解决方案3】:

如果您将“单词”定义为字母后跟数字,则此正则表达式将捕获它们:

([a-zA-Z][0-9.-]+)

然后您可以将它们替换为\1(反斜杠一个空格)。

【讨论】:

  • 这将适用于捕获,但如何排除所有 cmets(括号之间的文本)?我希望将它们排除在外,因为 cmets 已经具有适当的文本间距。如果不排除它们,那么普通文本的每个单词之间都会有一个双空格。
【解决方案4】:

您好,我也是 fanuc 程序员...我使用 notepad++ 我来了

(\(.*?\))|([0-9]|(]))([A-Z])

替换为

\1\2 \4

最后留个空格,但是...

我将(]) 添加到

x#750z0

我有另一个选择。

搜索:((.?))|([.?])|([0-9]|(]))([AZ])|((])(THEN| DO|GOTO))([AZ])

写入:\1\2\3\4\6\7 \5

【讨论】:

    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 2021-07-07
    • 2020-02-02
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2011-01-08
    • 2013-11-30
    相关资源
    最近更新 更多