我正在努力改善正则表达式。我正在使用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美元得到一个大写的第一个字母。我可以在MATCHING大写或小写但不转换为大写的情况下看到各种各样的例子。
我似乎需要做某种“功能”处理。我需要将$ 1传递给一些东西,然后将其分成两部分......第一个字母和所有其他字母......将第一个字母转换为大写字母......然后将它们一起粉碎并返回结果。
添加到该错误检查...虽然$ 1不太可能有数值,但我们仍应进行某种安全检查。
所以,如果有人能指出我的阅读材料,我会很感激。
答案 0 :(得分:2)
我认为根据您选择的语言,它可以非常简单。您可以在值列表上循环并查找匹配项,然后使用capitalize
方法将字符串放在字符串中,以便首次匹配:
for val in my_list:
m = match(^([^\s]+)\s+([^\s;]+)?.*,val)
print "%sanimals like %s are a result of poor genetics."%(m.group(1).capitalize(), m.group(1))
但是如果你想用regex
全部点缀它是不可能的,因为你需要修改你的字符串,这通常不是一个正则表达式正则表达式的正则表达式。
答案 1 :(得分:2)
非常简单,正则表达式只能替换原始字符串中的内容。 F
中没有资金fat dogs
,因此您无法获得Fat dogs
作为输出。
然而,这在Perl中是可能的,但仅仅因为Perl在正则表达式替换完成后处理文本,它不是正则表达式本身的特征。以下是一个简短的Perl程序(sans regex),如果从命令行运行,则执行大小写转换:
#!/usr/bin/perl -w
use strict;
print "fat dogs\n"; # fat dogs
print "\ufat dogs\n"; # Fat dogs
print "\Ufat dogs\n"; # FAT DOGS
相同的转义序列也适用于正则表达式:
#!/usr/bin/perl -w
use strict;
my $animal = "fat dogs";
$animal =~ s/(\w+) (\w+)/\u$1 \U$2/;
print $animal; # Fat DOGS
让我重复一遍,Perl是这样做的,而不是正则表达式。
根据您的真实世界示例,您可能不必更改字母的大小写。如果您输入的是Fat dogs
,那么您将获得所需的结果。否则,您必须自己处理$1
。
在PHP中,您可以在返回替换字符串之前使用preg_replace_callback()
来处理整个匹配,包括捕获的组。这是一个类似的PHP程序:
<?php
$animal = "fat dogs";
print(preg_replace_callback('/(\w+) (\w+)/', 'my_callback', $animal)); // Fat DOGS
function my_callback($match) {
return ucfirst($match[1]) . ' ' . strtoupper($match[2]);
}
?>
答案 2 :(得分:1)
正则表达式只匹配那里的表达式。你在做什么本质上是:
但你想要做的是:
正则表达式不做任何处理&#39;在比赛中,它只是首先找到匹配的语法。
大多数语言都有字符串处理,例如,如果您在变量eval()
和$1
中匹配,如上所述,您可能需要执行以下操作:
$2
如果你的语言是串联的大写函数,则假设$1 = upper(substring($1, 0, 1)) + substring($1, 1)
函数,upper()
返回一个子字符串(零索引)。
答案 3 :(得分:0)
所以最后答案是你可以使用正则表达式来改变......那不是它的工作。感谢其他人的投入,我能够调整自己的方法,并且仍然完成了这种自我学术任务的目标。
首先从OP中你会记得我有一个列表,我从该列表中捕获两个单词到正则表达式变量。好吧,我修改了正则表达式捕获以获得三个捕获组。例如:
^(\S)(\S+)\s+_(\S)?.*
//would turn fat dogs into
//$1 = f, $2 = at, $3 = dogs
然后使用Notepad ++然后我将其替换为:
\ u $ 1 2美元2美元的动物是由于遗传性差导致的。
通过这种方式,我能够将第一个字母转换为大写字母..但正如其他人指出的那样,这不是正则表达式进行转换而是另一个进程。 (在这种情况下,记事本++,但可能是你的c#,perl等)。
感谢大家帮助新手。