如何在perl中使用正则表达式检测符号?

如何在perl中使用正则表达式检测符号?,perl,Perl,请告诉我如何使用正则表达式检查单词是否以符号字符开头或结尾,以及如何处理符号中的文本 例如: (text)或text或tex't。还是文本? 换成 (text)或text或tex't。还是文本? 帮帮我 谢谢我假设“word”是指您示例中的字母数字字符?如果您有一个组成有效单词的允许的字符列表,那么这就足够了: my $string = "x1 .text1; 'text2 \"text3;\""; $string =~ s/([a-zA-Z0-9]+)/<t>$1<\/t

请告诉我如何使用正则表达式检查单词是否以符号字符开头或结尾,以及如何处理符号中的文本

例如:

  • (text)或text或tex't。还是文本?

    换成

  • (text)或text或tex't。还是文本?

帮帮我

谢谢

我假设“word”是指您示例中的字母数字字符?如果您有一个组成有效单词的允许的字符列表,那么这就足够了:

my $string = "x1 .text1; 'text2 \"text3;\"";
$string =~ s/([a-zA-Z0-9]+)/<t>$1<\/t>/g; 
              # Add more to character class [a-zA-Z0-9] if needed
print "$string\n";
# OUTPUT: <t>x1</t> .<t>text1</t>; '<t>text2</t> "<t>text3</t>;"
我假设“word”是指您示例中的字母数字字符?如果您有一个组成有效单词的允许的字符列表,那么这就足够了:

my $string = "x1 .text1; 'text2 \"text3;\"";
$string =~ s/([a-zA-Z0-9]+)/<t>$1<\/t>/g; 
              # Add more to character class [a-zA-Z0-9] if needed
print "$string\n";
# OUTPUT: <t>x1</t> .<t>text1</t>; '<t>text2</t> "<t>text3</t>;"

这将获取标准输入,并将其处理为标准输出,然后在标准输出上打印

    while (<>) {
       s {
           (  [a-zA-z]+  )     # word
           (?= [,.)?] )        # a symbol
         }
         {<t>$1</t>}gx ;
       print ;
    }

这将获取标准输入,并将其处理为标准输出,然后在标准输出上打印

    while (<>) {
       s {
           (  [a-zA-z]+  )     # word
           (?= [,.)?] )        # a symbol
         }
         {<t>$1</t>}gx ;
       print ;
    }

我在这里使用的是DVK的方法,但稍作修改。不同之处在于,她/他的代码也会在所有不包含/紧挨着符号的单词周围放置标签,这(根据问题中给出的示例)是不需要的

#!/usr/bin/perl

use strict;
use warnings;

sub modify {
   my $input     = shift;
   my $text_char = 'a-zA-Z0-9\-\''; # characters that are considered text

   # if there is no symbol, don't change anything
   if ($input =~ /^[a-zA-Z0-9]+$/) {
      return $input;
   }
   else {
      $input =~ s/([$text_char]+)/<t>$1<\/t>/g;
      return $input;
   }
}

my $initial_string  = "(text) or te-xt, or tex't. or text?";
my $expected_string = "(<t>text</t>) or <t>te-xt</t>, or <t>tex't</t>. or <t>text</t>?";

# version BEFORE edit 1:
#my @aux;

# take the initial string apart and process it one word at a time
#my @string_list = split/\s+/, $initial_string;
#
#foreach my $string (@string_list) {
#   $string = modify($string);
#   push @aux, $string;
#}
#
# put the string together again
#my $final_string = join(' ', @aux);

# ************ EDIT 1 version ************
my $final_string = join ' ', map { modify($_) } split/\s+/, $initial_string;    

if ($final_string eq $expected_string) {
   print "it worked\n";
}
#/usr/bin/perl
严格使用;
使用警告;
子修改{
我的$input=shift;
my$text_char='a-zA-Z0-9\-\'';被视为文本的字符
#如果没有符号,请不要更改任何内容
如果($input=~/^[a-zA-Z0-9]+$/){
返回$input;
}
否则{
$input=~s/([$text_char]+)/$1/g;
返回$input;
}
}
my$initial_string=“(text)或text,或tex't.或text?”;
my$expected_string=“(text)或text,或tex't.或text?”;
#编辑1之前的版本:
#我的@aux;
#将初始字符串分开,一次处理一个单词
#my@string\u list=split/\s+/,$initial\u string;
#
#foreach my$string(@string\u list){
#$string=修改($string);
#按@aux$string;
#}
#
#把绳子重新放在一起
#我的$final_string=join(“”,@aux);
#**********编辑1个版本************
我的$final_string=join“”,映射{modify($_)}split/\s+/,$initial_string;
如果($final_string eq$expected_string){
打印“它工作了\n”;
}
这让我觉得这是一种有点冗长的方法,但它似乎比制定一个更复杂的正则表达式要快


编辑1:我已经合并了DVK建议的更改(使用map而不是foreach)。现在语法突出显示看起来比以前更糟糕;我希望它不会模糊任何东西…

我在这里使用的是DVK的方法,但稍作修改。不同之处在于,她/他的代码也会在所有不包含/紧挨着符号的单词周围放置标签,这(根据问题中给出的示例)是不需要的

#!/usr/bin/perl

use strict;
use warnings;

sub modify {
   my $input     = shift;
   my $text_char = 'a-zA-Z0-9\-\''; # characters that are considered text

   # if there is no symbol, don't change anything
   if ($input =~ /^[a-zA-Z0-9]+$/) {
      return $input;
   }
   else {
      $input =~ s/([$text_char]+)/<t>$1<\/t>/g;
      return $input;
   }
}

my $initial_string  = "(text) or te-xt, or tex't. or text?";
my $expected_string = "(<t>text</t>) or <t>te-xt</t>, or <t>tex't</t>. or <t>text</t>?";

# version BEFORE edit 1:
#my @aux;

# take the initial string apart and process it one word at a time
#my @string_list = split/\s+/, $initial_string;
#
#foreach my $string (@string_list) {
#   $string = modify($string);
#   push @aux, $string;
#}
#
# put the string together again
#my $final_string = join(' ', @aux);

# ************ EDIT 1 version ************
my $final_string = join ' ', map { modify($_) } split/\s+/, $initial_string;    

if ($final_string eq $expected_string) {
   print "it worked\n";
}
#/usr/bin/perl
严格使用;
使用警告;
子修改{
我的$input=shift;
my$text_char='a-zA-Z0-9\-\'';被视为文本的字符
#如果没有符号,请不要更改任何内容
如果($input=~/^[a-zA-Z0-9]+$/){
返回$input;
}
否则{
$input=~s/([$text_char]+)/$1/g;
返回$input;
}
}
my$initial_string=“(text)或text,或tex't.或text?”;
my$expected_string=“(text)或text,或tex't.或text?”;
#编辑1之前的版本:
#我的@aux;
#将初始字符串分开,一次处理一个单词
#my@string\u list=split/\s+/,$initial\u string;
#
#foreach my$string(@string\u list){
#$string=修改($string);
#按@aux$string;
#}
#
#把绳子重新放在一起
#我的$final_string=join(“”,@aux);
#**********编辑1个版本************
我的$final_string=join“”,映射{modify($_)}split/\s+/,$initial_string;
如果($final_string eq$expected_string){
打印“它工作了\n”;
}
这让我觉得这是一种有点冗长的方法,但它似乎比制定一个更复杂的正则表达式要快



编辑1:我已经合并了DVK建议的更改(使用map而不是foreach)。现在语法突出显示看起来比以前更糟糕;我希望它不会模糊任何东西…

这也会改变像“文本文本”这样不以符号结尾的文本。justintime-我理解OP在“符号”中包含空格-我可能错了。带破折号字符的单词呢?我认为谁的文本。@ AyoCee——只是在类的末尾添加一个破折号:<代码> [AZ-ZO-9-9] (如果它在中间,它被认为是一个特殊的“范围”字符),但是如果在字符类的末尾,它只是普通的DASH字符),如果您想在示例中删除它们,请参阅问题更新。这也会更改不以符号结尾的文本,如“文本文本”。justintime-我理解OP将空格包含在“符号”中-我可能错了。带破折号字符的单词呢?我认为谁的文本。@ AyoCee——只是在类的末尾添加一个破折号:<代码> [AZ-ZO-9-9] (如果它在中间,它被认为是一个特殊的“范围”字符),但是如果在字符类的末尾,它只是普通的DASH字符),如果您想在示例中删除它们,请参阅问题的更新。如果一个单词以空格开头或结尾,该怎么办?这被认为是一个“符号”吗?带撇号的单词呢,比如
?带撇号和破折号的单词也是文本。如果一个单词以空格开头或结尾怎么办?这是否被认为是一个“符号”?关于撇号的词,比如<代码>不要< /代码>?撇号和破折号的单词也是文本。它几乎是A+ 1,但是请使用MAP而不是FURACH将整个拆分/前缀/连接转换成成语一行。但是a)我认为aliocee是一个初学者,所以我认为如果我把事情分开一点,她/他会更容易看到正在发生的事情;b) 夜深了,这对我来说更容易、更快;)当然,你是对的!不需要使用块形式