regex 将正则表达式匹配值的首字母强制为

8wtpewkr  于 2023-10-22  发布在  其他
关注(0)|答案(4)|浏览(110)

我正在努力改进正则表达式。我正在使用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不太可能有数字值,但我们仍然应该进行某种安全检查。
我需要在这里看什么阅读材料?

gopyfrb3

gopyfrb31#

一个正则表达式将只匹配那里的内容。你所做的基本上是:

  • 比赛项目第
  • 显示匹配

但你要做的是

  • 比赛项目第
  • 修改匹配项
  • 显示修改的匹配项

正则表达式不对匹配进行任何“处理”,它只是一种语法,用于首先找到匹配。
大多数语言都有字符串处理,例如,如果你在变量$1$2中有匹配,你会想做沿着行的事情:
$1 = upper(substring($1, 0, 1)) + substring($1, 1)
假设upper()函数,如果你的语言的字符串大写函数,substring()返回一个子字符串(零索引)。

h9a6wy2h

h9a6wy2h2#

简单地说,正则表达式只能替换原始字符串中的内容。在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]);
}
?>
hec6srdp

hec6srdp3#

我认为这可以很简单的基础上你的语言选择。你可以首先遍历值列表并找到你的匹配,然后通过使用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来点,这是不太可能的,因为你需要修改字符串,而这通常不是一个正则表达式,正则表达式适合的任务。

up9lanfz

up9lanfz4#

所以最后的答案是你不能用正则表达式来转换.这不是它的工作。多亏了别人的投入,我才能够调整我的方法,仍然完成了这个自我强加的学术任务的目标。
首先,从OP中你会记得我有一个列表,我从列表中捕获两个单词到正则表达式变量中。我修改了正则表达式捕获,得到了三个捕获组。例如:

^(\S)(\S+)\s+_(\S)?.*
//would turn fat dogs into
//$1 = f, $2 = at, $3 = dogs

然后用Notepad++替换成:
1$2的动物像$3是遗传学差的结果。
通过这种方式,我能够将第一个字母转换为..但正如其他人指出的那样,这不是正则表达式进行转换,而是另一个过程。(在这种情况下,notepad ++可以是你的c#,perl等)。
谢谢大家对新人的帮助。

相关问题