2

我试图弄清楚如何在没有一百万行代码的情况下拆分具有三个可能的分隔符(或没有分隔符)的字符串,但是对于像我这样的人来说,代码仍然是易读的。

字符串中有许多可能的组合。

    this-is_the.string
    this.is.the.string
    this-is_the_string
    thisisthestring

字符串中没有空格,也没有以下字符:

 ~`!@#$%^&*()+=\][{}|';:"/?>,<.

该字符串已被剥离,但:

0-9
a-Z
-
_ 
.

也没有连续的点、破折号或下划线。

我希望结果显示为 Result:

This Is The String

我真的很难做到这一点。我相信我需要使用哈希,即使经过数小时的反复试验,我也没有掌握这个概念。

我很困惑我可能会在多个分隔符上拆分一个字符串,其中分隔符可以是任何顺序和/或三种不同类型(或根本没有)并保持结果的顺序!

有什么可能吗?

4

6 回答 6

6

将字符串拆分为单词,将单词大写,然后在单词之间插入空格时连接单词。

它可以非常简洁地编码:

my $clean = join ' ', map ucfirst lc, split /[_.-]+/, $string;

如果你只想打印出结果,你可以使用

use feature qw( say );
say join ' ', map ucfirst lc, split /[_.-]+/, $string;

或者

print join ' ', map ucfirst lc, split /[_.-]+/, $string;
print "\n";
于 2012-08-02T00:54:24.943 回答
3

使用全局正则表达式来收集不是点、破折号或下划线的所有字符序列很简单。

之后,lc将小写每个字符串ucfirst并将其大写。对数组进行字符串化将在元素之间插入空格。

for ( qw/ this-is_the.string this.is.the.string this-is_the_string / ) {
  my @string = map {ucfirst lc } /[^-_.]+/g;
  print "@string\n";
}

输出

This Is The String
This Is The String
This Is The String
于 2012-08-02T01:05:34.320 回答
2

“分隔符可以在任何地方和/或三种不同的类型(或根本没有)” ......您需要一个分隔符来拆分字符串,您可以使用正则表达式拆分函数定义多个分隔符

my @parts = split(/[-_\.]/, $string);
print ucfirst "$_ " foreach @parts;
print "\n"
于 2012-08-02T00:37:51.740 回答
1

这是一个适用于除最后一个测试用例之外的所有人的解决方案。在没有分隔符的情况下拆分字符串非常困难,您需要有一个可能的单词列表,即使那样它也容易出错。

#!/usr/bin/perl

use strict;
use warnings;

my @strings = qw(
    this-is_the.string
    this.is.the.string
    this-is_the_string
    thisisthestring
);

foreach my $string (@strings) {
    print join(q{ }, map {ucfirst($_)} split(m{[_.-]}smx,$string)) . qq{\n};
}

这是循环的另一种选择,它将所有内容拆分为单独的语句以使其更易于阅读:

foreach my $string (@strings) {
    my @words = split m{[_.-]}smx, $string;
    my @upper_case_words = map {ucfirst($_)} @words;
    my $string_with_spaces = join q{ }, @upper_case_words;
    print $string_with_spaces . qq{\n};
}
于 2012-08-02T00:40:26.357 回答
1

并证明仅仅因为你可以,并不意味着你应该:P

$string =~ s{([A-Za-z]+)([_.-]*)?}{ucfirst(lc("$1")).($2?' ':'')}ge;
于 2012-08-02T04:08:24.627 回答
0

除了最后一种可能性:

use strict;
use warnings;

my $file;
my $newline;

open $file, "<", "testfile";
while (<$file>) {
    chomp;
    $newline = join ' ', map ucfirst lc, split /[-_\.]/, $_;
    print $newline . "\n";
}
于 2012-08-02T00:43:02.737 回答