正则表达式查找/替换用例

时间:2020-03-05 18:50:03  来源:igfitidea点击:

我最近与一位同事讨论了编辑。他使用了一位不那么受欢迎的编辑器,而我使用了另一位(我不愿透露哪个,因为这无关紧要,所以我想避免编辑器大战)。我说的是我不太喜欢他的编辑器,因为它不允许我们使用正则表达式查找/替换正则表达式。

他说他从来不想这么做,这令人惊讶,因为这是我一直在做的事情。但是,我无法提出一个或者两个以上的例子。这里有人可以提供一些例子,说明他们发现正则表达式在其编辑器中很有用吗?从那时起,我就可以提出一些实际要做的事的例子:

  • 删除文件中每一行的开头,如下所示:`第25634行:``第632157行:'
  • 取几十个带有标准头的文件,每个文件略有不同,然后一次从所有头文件中剥离前19行。
  • 将MySQL select语句的结果插入文本文件,然后删除所有格式的垃圾并将其重新格式化为Python字典,以在简单脚本中使用。
  • 在没有转义逗号的CSV文件中,将每行第八列的第一个字符替换为大写A。
  • 在../../mvl/svc/mvl_serv.c:850的_mvl_set_req_done(req = 0x82624a4,result = 27158)中的`#3 0x080a6d61(req = 0x82624a4,result = 27158)这样的行中给出一堆GDB堆栈跟踪函数名称。

还有其他人有现实生活中的例子吗?下次出现此问题时,我想准备更充分地列出为什么使用此功能的好示例。

解决方案

回答

就在上周,我使用正则表达式查找/替换将CSV文件转换为XML文件。

确实很简单,只需将每个字段切碎(幸运的是,它没有任何转义的逗号),然后用适当的标签将其推回去,以代替逗号。

回答

使用正则表达式可以轻松地使用单词边界替换整个单词。

(\b\w+\b)

因此,我们可以替换文件中不需要的单词,而不会打扰诸如Scunthorpe之类的单词

回答

我喜欢使用正则表达式来重新格式化以下项目列表:

int item1
double item2

public void item1(int item1){
}
public void item2(double item2){
}

这可以节省大量时间。

回答

对于任何编辑器,我要做的第一件事就是尝试弄清正则表达式的怪异之处。我用它所有的时间。没什么好疯狂的,但是当我们必须在不同类型的文本之间复制/粘贴内容时,SQL便是很方便的。SQL <-> PHP是我最常使用的一种,而我们又不想放屁进行500次相同的更改。

回答

当有人在列中(例如100-200)向我发送患者就诊号码列表时,我会一直使用它,而我需要使用" 0000000444"," 000000004445"格式。为我创造奇迹!

我还使用它来提取电子邮件中的电子邮件地址。我经常发送群组电子邮件,所有退回的退还邮件都以一封电子邮件的形式返回。因此,我用正则表达式将它们全部拉出,然后将它们放入字符串var中,以便从数据库中删除。

我什至编写了一个小对话框,以便将正则表达式应用到剪贴板。它抓取应用正则表达式的内容,然后将其加载回剪贴板。

回答

每当我尝试替换跨多行的值时,Regex都很方便。或者当我想用包含换行符的值替换值时。

我还喜欢我们可以匹配正则表达式中的内容,而不必使用$ syntax替换完整匹配项以输出要维护的匹配项的一部分。

回答

我同意我们在第3、4和5点上的看法,但不一定与第1点和第2点有关。

在某些情况下,使用匿名键盘宏更容易实现1和2.

我的意思是执行以下操作:

  • 将光标放在第一行
  • 开始键盘宏录制
  • 修改第一行
  • 将光标放在下一行
  • 停止记录。

现在,修改下一行所需要做的就是重复宏。

我可以在不支持正则表达式的情况下生存,但是如果没有匿名键盘宏就无法生存。

回答

我一直在网络开发中使用的一件事是剥离其HTML标签的某些文本。可能需要执行此操作以清理用户输入的安全性或者显示新闻的预览。例如,如果文章带有许多用于格式设置的HTML标签,则不能只做LEFT(article_text,100)+'...'(加上"阅读更多"链接)并将其呈现在页面上,拆分HTML标签可能会破坏页面。

另外,我不得不在链接到不再存在的图像的数据库记录中剥离img标签。而且,我们不要忘记Web表单验证。如果要使用户在Web表单中输入正确的电子邮件地址(从语法上来说),这是彻底检查它的唯一方法。

回答

昨天,我使用了为Oracle表创建的create table语句,并使用JDBC和PreparedStatements将字段转换为setString()方法调用。该表的字段名称已映射到我的类属性,因此正则表达式搜索和替换非常合适。

创建表文本:

...
field_1 VARCHAR2(100) NULL,
field_2 VARCHAR2(10) NULL,
field_3 NUMBER(8) NULL,
field_4 VARCHAR2(100) NULL,
....

我的正则表达式搜索:

/([a-z_])+ .*?,?/

我的替代品:

pstmt.setString(1, );

结果:

...
pstmt.setString(1, field_1);
pstmt.setString(1, field_2);
pstmt.setString(1, field_3);
pstmt.setString(1, field_4);
....

然后,我仔细检查并手动设置每个调用的位置int,并在必要时将方法更改为setInt()(及其他),但这对我来说很方便。实际上,对于类似的字段到方法调用转换,我实际上使用了三到四次。

回答

我刚刚将一个长字符序列粘贴到字符串文字中,现在我想将其分解为较短的字符串文字的串联,这样它就不会换行了。我也希望它可读,所以我只想在空格后面打断。我选择整个字符串(减去引号),然后使用此正则表达式进行仅选择中的全部替换:

/.{20,60} /

...以及此替换:

/
String s = "I recently discussed editors with a co-worker. He uses one "
         + "of the less popular editors and I use another (I won't say "
         + "which ones since it's not relevant and I want to avoid an "
         + "editor flame war). I was saying that I didn't like his "
         + "editor as much because it doesn't let you do find/replace "
         + "with regular expressions.";
"? + "/

...其中的稻草人是实际的换行符,空格数从一个事件到下一个事件都不同。结果:

##代码##