2

100 万行のコードを使用せずに 3 つの区切り文字 (またはなし) を持つ文字列を分割する方法を見つけようとしていますが、コードは私のような人にはまだ判読可能です。

文字列で可能な多くの組み合わせ。

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

文字列にスペースはなく、次の文字もありません。

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

文字列は、次のもの以外はすべて削除されています。

0-9
a-Z
-
_ 
.

また、連続するドット、ダッシュ、またはアンダースコアもありません。

結果を Result のように表示したい:

This Is The String

私はこれを実現するのに本当に苦労しています。ハッシュを使用する必要があると思いますが、何時間も試行錯誤した後でも概念を理解していません。

区切り文字が任意の順序である可能性がある複数の区切り文字で文字列を分割でき、AND/OR 3 つの異なるタイプ (またはまったくない) であり、結果の順序を維持できるという事実に当惑しています!

可能性はありますか?

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

"区切り文字はどこでも可能 AND/OR 3 つの異なるタイプ (またはまったくなし)" ... 文字列を分割するには区切り文字が必要です。分割関数に正規表現を使用して複数の区切り文字を定義できます

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

そして、それができるからといって、そうすべきだという意味ではありません:P

$string =~ s{([A-Za-z]+)([_.-]*)?}{ucfirst(lc("$1")).($2?' ':'')}ge;
于 2012-08-02T04:08:24.627 に答える
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 に答える
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 に答える