为了使正则表达式更加简短,是否有一种简写方法来引用同一正则表达式中较早出现的字符类?
例子
有没有办法缩短以下内容:
[acegikmoqstz@#&].*[acegikmoqstz@#&].*[acegikmoqstz@#&]
给定一个类,例如
[:digit:]
Run Code Online (Sandbox Code Playgroud)
我希望输出是
0123456789
Run Code Online (Sandbox Code Playgroud)
请注意,该方法应该适用于所有 POSIX 字符类。这是我尝试过的
$ printf %s '[:digit:]'
[:digit:]
Run Code Online (Sandbox Code Playgroud)
我很难让 sed 识别其模式字符串中的连字符和下划线。
有谁知道为什么
[a-z|A-Z|0-9|\-|_]
Run Code Online (Sandbox Code Playgroud)
在以下示例中的工作方式如下
[a-z|A-Z|0-9|_]
Run Code Online (Sandbox Code Playgroud)
?
$ cat /tmp/sed_undescore_hypen
lkjdaslf lkjlsadjfl dfpasdiuy service-type = service-1; jaldkfjlasdjflk address = address1; kldjfladsf
lkjdaslf lkjlsadjfl dfasdf service-type = service_1; jaldkfjlasdjflk address = address1; kldjfladsf
$ sed 's/.*\(service-type = [a-z|A-Z|0-9|\-|_]*\);.*\(address = .*\);.*/\1 \2/g' /tmp/sed_undescore_hypen
lkjdaslf lkjlsadjfl dfpasdiuy service-type = service-1; jaldkfjlasdjflk address = address1; kldjfladsf
service-type = service_1 address = address1
$ sed 's/.*\(service-type = [a-z|A-Z|0-9|\-]*\);.*\(address = .*\);.*/\1 \2/g' /tmp/sed_undescore_hypen
service-type = service-1 address = address1
lkjdaslf lkjlsadjfl dfasdf service-type = service_1; …Run Code Online (Sandbox Code Playgroud) 当我们在同一个字符类中包含字符类和否定字符类的速记时,它是否与 dot 相同。这意味着任何字符?
我在regex101.com上做了一个测试,每个字符都匹配。
是[\s\S] [\w\W]和[\d\D]一样. 吗?
我想知道这种行为是否在 Web 的前端和后端语言(如 Javascript、Php、Python 等)中持续存在。
在cygwin中,这不会返回匹配:
$ echo "aaab" | grep '^[ab]+$'
Run Code Online (Sandbox Code Playgroud)
但这确实会返回一个匹配:
$ echo "aaab" | grep '^[ab][ab]*$'
aaab
Run Code Online (Sandbox Code Playgroud)
这两个表达式不一样吗?有没有办法表达"字符类的一个或多个字符"而不键入两次字符类(如在秒示例中)?
根据这个链接,两个表达式应该是相同的,但也许Regular-Expressions.info不包括cygwin中的bash.
如何让awk识别字符类?
例如,这个:
echo "a\n1\nb\n2\nc" | awk '/1/'
Run Code Online (Sandbox Code Playgroud)
1按预期输出,但这个:
echo "a\n1\nb\n2\nc" | awk '/\d/'
Run Code Online (Sandbox Code Playgroud)
没有输出任何我期望的东西,1并2在过滤器中存活.
我认为这可能与shell转义(zsh)有关,但awk '/\\d/'也无效.
我写了一个Perl脚本,打印出与Unicode属性匹配的字符.到目前为止,它似乎适用于大多数房产.
但它打印出ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ
ÿ匹配的字符[^\w].这些字符应该匹配\w.奇怪的是,他们匹配\p{Word}.
我试过没有成功:
map { decode ( "UTF-8", $_ ) }map { pack 'U0C*', unpack 'C*', $_ }如何使[^\w]这些单词字符不匹配?
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
binmode STDOUT, ':utf8';
my $c;
my $cols = 80;
my $arg = shift;
my $regex = qr/$arg/;
for ( map { chr } 0x20 .. 0xFFFF )
{
next if /\p{Unassigned}|\p{NChar}|\p{Cs}/;
if ( $_ =~ $regex )
{
print STDOUT;
print …Run Code Online (Sandbox Code Playgroud) 我在 RHEL 上的 GAWK 版本是:
gawk-3.1.5-15.el5
Run Code Online (Sandbox Code Playgroud)
我想打印一行,如果它的第一个字段包含所有数字(没有特殊字符,甚至要考虑空格)
Example:
echo "123456789012345,3" | awk -F, '{if ($1 ~ /^[[:digit:]]$/) print $0}'
Output:
Nothing
Expected Output:
123456789012345,3
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题?我的 AWK 版本不理解 GNU 字符类吗?请帮忙
我正在尝试做的是允许程序根据遇到的文本来定义字符类。但是,<[]>从字面上接受字符,并且以下产生错误:
my $all1Line = slurp "htmlFile";
my @a = ($all1Line ~~ m:g/ (\" || \') ~ $0 {} :my $marker = $0; http <-[ $marker ]>*? page <-[ $marker ]>*? /); # error: $marker is taken literally as $ m a r k e r
Run Code Online (Sandbox Code Playgroud)
我想匹配所有格式为“ https:// foo?page = 0?ssl = 1 ”或“ http ... page ...”的链接
非常感谢你!
我从Generate unique alphanumeric IDs中了解到,我可以使用stringi并stri_rand_strings生成唯一的字母数字 ID。我试图找出一种有效的方法来做到这一点,但只包括数字 0-9 和所有字母,但“I”和“O”除外。我似乎无法弄清楚如何将其包含在模式中c( LETTERS[c(1:8,10:14,16:26)],"[0-9]")
stri_rand_strings(25, 6)
Run Code Online (Sandbox Code Playgroud)