我正在努力改进正则表达式。我正在使用regex101.com。我有一个正则表达式,它有两个捕获组。然后我使用替换将捕获的值合并到另一个位置。
例如,我有一个值列表:
fat dogs
thin cats
skinny cows
purple salamanders
etc...
这将它们转化为两个变量:
^([^\s]+)\s+([^\s;]+)?.*
然后我用1美元和2美元替换成新的句子。举例来说:
$1 animals like $2 are a result of poor genetics.
(显然这是一个愚蠢的例子)
这是可行的,我得到了我的句子,但我被难倒试图迫使1美元有一个不确定的第一个字母。我可以看到各种各样的例子,匹配或匹配,但不转换为匹配。
看来我需要做一些“功能”处理。我需要把1美元传递给一个东西,然后把它分成两部分...第一个字母和其他字母把第一部分变成...然后再重新组合并返回结果。
添加到错误检查.虽然$1不太可能有数字值,但我们仍然应该进行某种安全检查。
我需要在这里看什么阅读材料?
4条答案
按热度按时间gopyfrb31#
一个正则表达式将只匹配那里的内容。你所做的基本上是:
但你要做的是
正则表达式不对匹配进行任何“处理”,它只是一种语法,用于首先找到匹配。
大多数语言都有字符串处理,例如,如果你在变量
$1
和$2
中有匹配,你会想做沿着行的事情:$1 = upper(substring($1, 0, 1)) + substring($1, 1)
假设
upper()
函数,如果你的语言的字符串大写函数,substring()
返回一个子字符串(零索引)。h9a6wy2h2#
简单地说,正则表达式只能替换原始字符串中的内容。在
fat dogs
中没有大写的F
,所以你不能得到Fat dogs
作为你的输出。然而,这在Perl中是可能的,但只是因为Perl在正则表达式替换完成后处理文本,它不是正则表达式本身的特性。下面是一个简短的Perl程序(无正则表达式),如果从命令行运行,它将执行大小写转换:
同样的转义序列也适用于正则表达式:
让我重复一遍,这是Perl做的,而不是正则表达式。
根据你的真实的世界的例子,你可能不必改变字母的大小写。如果你的输入是
Fat dogs
,那么你会得到想要的结果。否则,您必须自己处理$1
。在PHP中,可以使用
preg_replace_callback()
处理整个匹配,包括捕获的组,然后返回替换字符串。下面是一个类似的PHP程序:hec6srdp3#
我认为这可以很简单的基础上你的语言选择。你可以首先遍历值列表并找到你的匹配,然后通过使用
capitalize
方法将组放入你的字符串中。但是如果你想用
regex
来点,这是不太可能的,因为你需要修改字符串,而这通常不是一个正则表达式,正则表达式适合的任务。up9lanfz4#
所以最后的答案是你不能用正则表达式来转换.这不是它的工作。多亏了别人的投入,我才能够调整我的方法,仍然完成了这个自我强加的学术任务的目标。
首先,从OP中你会记得我有一个列表,我从列表中捕获两个单词到正则表达式变量中。我修改了正则表达式捕获,得到了三个捕获组。例如:
然后用Notepad++替换成:
1$2的动物像$3是遗传学差的结果。
通过这种方式,我能够将第一个字母转换为..但正如其他人指出的那样,这不是正则表达式进行转换,而是另一个过程。(在这种情况下,notepad ++可以是你的c#,perl等)。
谢谢大家对新人的帮助。