强制正则表达式匹配值的第一个字母大写

3
我正在尝试提高正则表达式的技能。我在使用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不太可能有数字值,但我们仍然应该进行某种安全检查。
所以如果有人能指点我阅读材料,我会非常感激。

1
你看过这篇文章吗:https://dev59.com/dnM_5IYBdhLWcg3w8IHR - AnalystCave.com
1
似乎正则表达式(转换为大写)无法完成任务。您需要处理捕获的组。您使用的是什么编程语言? - emartinelli
1
你使用的编程语言是什么? - Mazdak
不确定您所说的“语言”是什么意思。由于这只是教育性质的,我没有将其纳入C#或JavaScript等编程语言中,我唯一使用的是regex101默认的pcre。 - GPGVM
@Bohemian,我可以将我的匹配方式改为一些简写形式,如^(\S+)\s+(\S;]+)?.*。 - GPGVM
жҳҜзҡ„пјҢ^(\S+)\s+([^\s;]+)?.* жҳҜзӣёеҗҢзҡ„гҖӮ - Bohemian
4个回答

2
简单来说,正则表达式只能替换原始字符串中存在的内容。在“fat dogs”中没有大写字母“F”,因此您无法得到“Fat dogs”的输出。
然而,在Perl中这是可能的,但仅因为Perl在正则表达式替换完成后处理文本,这不是正则表达式本身的功能。以下是一个简短的Perl程序(不含正则表达式),可以在命令行中运行以执行大小写转换:
#!/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]);
}
?>

好答案。我很久以前就忘记了我自学多年的PERL,但我记得 - 做事情的方法不止一种! - Ed B

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))

但是,如果你想用 正则表达式 来完成所有的事情,这几乎不可能,因为你需要修改你的字符串,而这通常不是正则表达式适合处理的任务。


2
正则表达式只会匹配输入的内容。你现在正在做的事情本质上是:
  • 匹配项目
  • 显示匹配项
但是你想要做的是:
  • 匹配项目
  • 修改匹配项
  • 显示修改后的匹配项
正则表达式不会对匹配结果进行任何处理,它只是一种用来查找匹配项的语法。
大多数编程语言都有字符串处理功能。例如,如果你在变量$1$2中存储了匹配项,你可能需要执行类似以下的操作:

$1 = upper(substring($1, 0, 1)) + substring($1, 1)

这里假设upper()函数是你编程语言中的字符串大写函数,而substring()函数返回一个子字符串(索引从零开始)。

正则表达式匹配的澄清点很好。是的,我有些模糊了界限。 - GPGVM

1
所以最终的答案是,您不能使用正则表达式来进行转换......这不是它的工作。感谢其他人的意见输入,我能够调整我的方法,仍然完成了这个自我造成的学术任务的目标。
首先从OP中你会记得,我有一个列表,我正在将列表中的两个单词捕获到正则表达式变量中。我修改了正则表达式的捕获方式,以获取三个捕获组。例如:
^(\S)(\S+)\s+_(\S)?.*
//would turn fat dogs into
//$1 = f, $2 = at, $3 = dogs

然后我使用Notepad ++将其替换为:

\u$1$2动物,如$3,是基因不良的结果。

通过这种方式,我能够将首字母转换为大写。但正如其他人指出的那样,这并不是正则表达式进行转换的方法,而是另一个过程。(在这种情况下是Notepad ++,但也可以是您的c#,perl等)。

感谢大家帮助这位新手。


请选出您认为最完整和有帮助的答案,并将其标记为被接受的答案。这会鼓励人们在未来发布有用的答案! - CJ Dennis

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