[PR]ネットとスマホ OCNでまとめておトク!2つの割引で月額基本料が【永年1,300円/月割引】

正規表現でマッチした数字文字を計算して置換することを1行で記述できますか?

たとえば
2004/01/01 --> 2004/01/17
2004/01/02 --> 2004/01/18
2004/01/03 --> 2004/01/19

$a = '2004/01/01';
$a =~ s/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/\1\/\2\/???????/;

?????の部分です。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

sprintfを使えばできます。


???????以外のところも変更しますけど。

$a = '2004/01/01';
$a =~ s/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/sprintf "$1\/$2\/%d", $3+16/e;

最後の e をお忘れなく。
    • good
    • 1

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qサクラエディタ 数字だけを置換するには

サクラエディタ 数字だけを置換するにはどうしたらいいでしょうか。
困っています。

Aベストアンサー

こんにちわ^^
回答ではないのですが、あまりにも情報が少なかったので質問させていただきます。
まず、
>数字だけを置換するにはどうしたらいいでしょうか
との事ですが、
◆質問1
例1
「あいうえお1かきくけこ2さしすせそ3」の様に文字列の間に数字(1桁)が挿入されている場合でしょうか?

例2
「あいうえお12かきくけこ78さしすせそ999」の様に文字列の間に数字(複数桁)が挿入されている場合でしょうか?

◆質問2
例1
「あいうえお1かきくけこ2さしすせそ3」
の数字を全部『直したい』という文字列に置換したい。
という場合なのか

例2
「あいうえお1かきくけこ2さしすせそ3」
の数字を1と2は『直したい』に置換3は『とても直したい』に置換というような場合でしょうか?

Q正規表現で文字クラスの引き算

お世話になります。
正規表現の文字クラスについてお聞きします。

0~6 の数字1字を [0-6] という風に指定しますが、
.NET 正規表現では、
この中から 3~5 は除く、というようなとき、
[0-6-[3-5]] と言う風に書けるようですが、
Perl では書けないようです。
(一応ラクダ本と perldoc perlre には当たりました)

#! perl
# regtest.pl -- 正規表現のテスト

while(<DATA>) {
chomp;
print "$_ matches /[0-6-[3-5]/\n" if /[0-6-[3-4]/;
}

__DATA__
0
1
2
3
4
5
6
7
8
9

のようなスクリプトを動かすと、

C:\test>regtest.pl
0 matches /[0-6-[3-5]/
1 matches /[0-6-[3-5]/
2 matches /[0-6-[3-5]/
3 matches /[0-6-[3-5]/
4 matches /[0-6-[3-5]/
5 matches /[0-6-[3-5]/
6 matches /[0-6-[3-5]/

のような結果が得られ、引き算が確かに聞いていません。

Perl と .NET 正規表現は互換ではないのでしょうか。
また、Perl でも同じことが書けるでしょうか。
よろしくご教示願います。

お世話になります。
正規表現の文字クラスについてお聞きします。

0~6 の数字1字を [0-6] という風に指定しますが、
.NET 正規表現では、
この中から 3~5 は除く、というようなとき、
[0-6-[3-5]] と言う風に書けるようですが、
Perl では書けないようです。
(一応ラクダ本と perldoc perlre には当たりました)

#! perl
# regtest.pl -- 正規表現のテスト

while(<DATA>) {
chomp;
print "$_ matches /[0-6-[3-5]/\n" if /[0-6-[3-4]/;
}

__DATA__
0
1
2
3
4
5
6
7
8
9

の...続きを読む

Aベストアンサー

.NET 正規表現とは違ったアプローチになりますが、一応あることはあります。
(.NET 正規表現互換も、package Something; use overload; sub import { overload::constant qr => \&substraction } sub substraction { #... } みたいなことをすればできるかもしれませんが――私はよく知りません)

本題に戻りますが、Unicode ブロック属性を用いれば目的は果たせると思います。
例えば:

use utf8;
print 1 if 'あ' =~ /\p{InHiragana}/;

このように、\p{InHOGE} という形の文字クラス (と呼ぶのでしょうか) が utf8 プラグマの機能として (自信なし) 用意されています。
ちなみに、CJK 統合漢字の属性は \p{InCJKUnifiedIdeographs} だったと思います。
さらにこの属性を自分で作ることもでき:

sub InKana {
return <<'EOF';
+utf8::InHiragana
+utf8::InKatakana
EOF
}

まあこんな感じで、+ から始まる属性は追加、- から始まるやつは削除という風に定義できるらしいです。
応用すれば CJK から J を引いたクラスも作れると思います。
文字のバイト列を調べて平仮名かどうか調べる――といったテクニックの現代版と言えるのでしょうか。分かりません。

`perldoc perlunicode' で more details を得ることができると思います。
なお、この回答は全般的に「自信なし」です。

.NET 正規表現とは違ったアプローチになりますが、一応あることはあります。
(.NET 正規表現互換も、package Something; use overload; sub import { overload::constant qr => \&substraction } sub substraction { #... } みたいなことをすればできるかもしれませんが――私はよく知りません)

本題に戻りますが、Unicode ブロック属性を用いれば目的は果たせると思います。
例えば:

use utf8;
print 1 if 'あ' =~ /\p{InHiragana}/;

このように、\p{InHOGE} という形の文字クラス (と呼ぶのでしょうか...続きを読む

Q正規表現でAND検索はできるのでしょうか

正規表現でAND検索はできるのでしょうか?

現在ASPでデータベースのデータを検索しようとしているのですが,検索エンジンみたいに複数の語をスペースで区切って入力して,データを絞り込んで表示したいのです。

OR検索みたいにそれぞれの語を"|"でつなぐというようなやり方があるのでしょうか?
それとも一つ一つの語で検索を繰り返すという方法しかないのでしょうか?

ご存知の方,ご教授ください。

Aベストアンサー

&&でつながれたらいかがですか?

(?=.*stat)(?=.*ate)はAND検索という意味ではありません。
statedのようにstatとateを重複して含む単語にマッチするという意味です。

普通はこんな回りくどいことはせず、
/stat/ && /ate/
で済ませると思います。
(もしくは単純にループでまわしていくとか)


foo.*bar|bar.*foo
も、2語程度までが限界ですよね。
10語分繋げることを考えると気が遠くなります。
(記述も処理時間も)

言語によってはさらに処理を短縮できるような
特有な構文がありますから、調べてみればよろしいかと思います。

QExcelで正規表現やワイルドカードなどを使って置換したいのですが…

Excelの中で置換をしたいのですが、
例えば以下のように( )かっこでくくられた不規則な数字を検索し、その前後に記号を付加するといった具合です。
Wordだと置換で正規表現が使えますが、Excelではやはりマクロを作らないとだめなのでしょうか?

 置換前
  あいう(123)かきく(あああ)
  さしす(ははは)たち(589)つ
   ・      ・
   ・      ・

 置換後
  あいう★(123)★かきく(あああ)
  さしす(ははは)たち★(589)★つ
   ・      ・
   ・      ・

Aベストアンサー

以下の正規表現アドインを使用すると可能です。
http://srcedit.pekori.jp/tool/excelre.html

置換前 ((\d+))
置換後 ★$1★

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Q(秀丸)正規表現で、CSV内金額へ消費税計算置換

お世話になります。
(秀丸の)正規表現について教えてください。

たとえば、CSVテキストファイルに、1行、
ABC,DEF,"10,000円","10,500円",GHI
という文字列が存在しています。

そこでご質問なのですが、
(秀丸の)正規表現を利用し、
上記"10,000円"の文字列を、
10000と判断させて、その数値に対して1.08掛け算して(8%消費税を加算して、)
右となりの、上記"10,500円"を、"10,800円"と変更して置換したいです。
(ちなみに秀丸は、2013年12月16日(月)現在の
 最新バージョンVer8.32を利用しています)

以上になります。
宜しくお願いいたします。

Aベストアンサー

#4です。
以下のスクリプトを作成してください。
文字コードはutf-8にしなければいけません。
-----------------------------------------
# 注意事項:このスクリプトはutf-8コードで作成すること
use strict;
use warnings;
use utf8;
use Encode;
use Text::CSV_XS;
my $file = shift(@ARGV);
my $csv = Text::CSV_XS->new ({ binary => 1,
'quote_char' => '`',
'escape_char' => '`',
}) or die "Cannot use CSV: ".Text::CSV->error_diag ();
open my $fh, "<:encoding(cp932)", $file or die "$file: $!";
while (my $row = $csv->getline ($fh)) {
my $item1 = encode('cp932',$row->[0]);
my $item2 = encode('cp932',$row->[1]);
my $item3 = encode('cp932',$row->[2]);
my $item4 = encode('cp932',$row->[3]);
my $item5 = encode('cp932',$row->[4]);
# ,と円を取り除く
my $val3 = &get_value($item3);
my $val4 = int($val3 * 1.08);
# ,と円を付加する
$item4 = &set_value($val4);
# バッククオートで両端をくくる
$item1 = &wrap_quote($item1);
$item2 = &wrap_quote($item2);
$item3 = &wrap_quote($item3);
$item4 = &wrap_quote($item4);
$item5 = &wrap_quote($item5);
my @item = ();
push @item,$item1;
push @item,$item2;
push @item,$item3;
push @item,$item4;
push @item,$item5;
my $newline = join ',',@item;
print $newline,"\n";
}
$csv->eof or $csv->error_diag ();
close $fh;
# ,と円を取り除く
sub get_value
{
my $item = shift(@_);
$item =~ s/[^\d]//g;
return $item;
}
# ,と円を付加する
sub set_value
{
my $item = shift(@_);
1 while $item =~ s/(.*\d)(\d\d\d)/$1,$2/;
$item .= encode('cp932','円');
return $item;
}
# バッククオートでくくる
sub wrap_quote
{
my $item = shift(@_);
$item = '`' . $item . '`';
return $item;
}
-----------------------------------------------------
上記のスクリプトをsample.plとします。
CSVテキストファイルをinput.txtとすると
コマンドプロンプトで、input.txtが存在するディレクトリに移動し、
perl sample.pl input.txt > output.txt
とします。
output.txtが期待する結果です。

こちらでの確認結果です。
perlのバージョン v5.14.2
input.txtの内容
---------------------------
`ABC`,`DEF`,`10,010円`,`10,500円`,`GHI"`
`ABC1`,`DEF`,`11,010円`,`10,500円`,`GHI`
`ABC2`,`DEF`,`12,010円`,`10,500円`,`GHI`
`ABC3`,`DEF`,`13,010円`,`10,500円`,`GHI`
`ABC4`,`DEF`,`14,010円`,`10,500円`,`GHI`
`ABC5`,`DEF`,`810円`,`10,500円`,`GHI`
`ABC6`,`DEF`,`10円`,`10,500円`,`GHI`
---------------------------------
output.txtの内容
---------------------------
`ABC`,`DEF`,`10,010円`,`10,810円`,`GHI"`
`ABC1`,`DEF`,`11,010円`,`11,890円`,`GHI`
`ABC2`,`DEF`,`12,010円`,`12,970円`,`GHI`
`ABC3`,`DEF`,`13,010円`,`14,050円`,`GHI`
`ABC4`,`DEF`,`14,010円`,`15,130円`,`GHI`
`ABC5`,`DEF`,`810円`,`874円`,`GHI`
`ABC6`,`DEF`,`10円`,`10円`,`GHI`
----------------------------------------
注意事項
sample.pl はutf-8で作成、改行コードは、CR+LF
input.txt はshift-jis、改行コードは、CR+LF
で確認しています。
文字コードと改行コードは、秀丸の ファイル->エンコードの種類 で確認又は設定してください。
また、金額を1.08倍したときの1円未満は切り捨てています。

#4です。
以下のスクリプトを作成してください。
文字コードはutf-8にしなければいけません。
-----------------------------------------
# 注意事項:このスクリプトはutf-8コードで作成すること
use strict;
use warnings;
use utf8;
use Encode;
use Text::CSV_XS;
my $file = shift(@ARGV);
my $csv = Text::CSV_XS->new ({ binary => 1,
'quote_char' => '`',
'escape_char' => '`',
}) or die "Cannot...続きを読む

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Q正規表現で全角数字を半角数字に置換する方法は?

いつもお世話になっております。

テキスト内の全角数字5桁のみを該当の半角数字5桁に置換する方法を探しています。

OS:Win
テキストエディタ:sakuraエディタ、秀丸

例)
----------------------------------------
あいうえお01234かきくけこ99さしすせそ

あいうえお01234かきくけこ99さしすせそ
----------------------------------------

正規表現で行えばいいと思い、置換文字列を
 [0-9][0-9][0-9][0-9][0-9]
あるいは
 [0-9]{5}
にしましたが、置換後の文字列が分かりません。

試しに検索で上記の文字列を試すと、該当箇所がマークされるので、
置換前の文字列は合っています。

置換後の文字列をご教授願えますでしょうか。


※テキストエディタで無理ならプログラム組みます。
VBScriptを考えていますが、他に良い言語があれば併せて教えてください。

Aベストアンサー

No.4 & No.5 です。
質問文中の「のみ」を見逃していました。
6桁や10桁は変換してはいけないのですね。
方法を考えてみたのですが、やや手順が長くなってしまいました。
なお、テキストファイルを処理するので表は存在しないものとしています。
(存在する場合は単語の先頭や末尾を考慮する必要がある)

1.全角数字以外にはさまれた全角数字5文字を変換する
(1) 検索でワイルドカード使用
(2) 検索する文字列は「[!0-9][0-9]{5}[!0-9]」
(3) 「検索先」「メイン文書」を順にクリック
(マクロの記録中ならここでいったん閉じて再び検索)
(4) 検索する文字列を「[0-9]{5}」にする
(5) 「検索先」「現在の選択」を順にクリック
(6) 閉じる
(7) 半角に変換
これで文頭以外は変換できるはずです。

2.文頭
文頭に全角数字5文字がある場合、それより前に文字がないため上記手順では選択されません。
そこで、(2)の検索する文字列を「<[0-9]{5}[!0-9]」にしてもう一度上記手順を実行するか、いっそのこと手動で選択して半角に変換するか等を行う必要があります。

何度も使用するなら記録マクロにしておけばよいと思います。


ところで、サクラエディタはマクロとしてWSHが使用可能だと聞いたことがあります。
ということは、たとえばNo.6様提示のソースを改造したり、VBScriptで書いたりしてマクロとして使用してもよいのではないでしょうか。

No.4 & No.5 です。
質問文中の「のみ」を見逃していました。
6桁や10桁は変換してはいけないのですね。
方法を考えてみたのですが、やや手順が長くなってしまいました。
なお、テキストファイルを処理するので表は存在しないものとしています。
(存在する場合は単語の先頭や末尾を考慮する必要がある)

1.全角数字以外にはさまれた全角数字5文字を変換する
(1) 検索でワイルドカード使用
(2) 検索する文字列は「[!0-9][0-9]{5}[!0-9]」
(3) 「検索先」「メイン文書」を順にクリック
(マクロの記録...続きを読む

QEXCELの文字列操作で文字数不足の分をスペースで補う方法

EXCELの文字データを取り出す際に以下のような操作を行いたいんですが、方法をご存知の方がいらっしゃいましたら教えていただけませんでしょうか。

既にデータの入力されているセルの文字数が、ある一定数に満たない場合は不足分を半角スペースで補う

【例】文字数を15と指定したとします
セルに入力されたデータ:山田_ 太郎
   ↓
求めたいデータ:山田_ 太郎_ _ _ _ _ _
(山田の後に半角スペースが1、太郎の後に半角スペースが6つ入っていると仮定してください)

※TEXT関数で数値の文字数不足分を0で埋めるということはできたのですが、TEXT関数は数値のみを対象としているようで・・・。
【例】12345 → 000000000012345

よろしくお願いいたします。

Aベストアンサー

A1に「山田 太郎」が入っている場合、
 =LEFTB(A1&REPT(" ",15),15)
と式を立てればOKです。

LEFBは、左側から指定バイト分(半角1バイト・全角2バイト)を抜き出す関数。
REPTは、所定の文字をくり返す関数です。

Q正規表現の置換で数値のみを抽出するには

お世話になっております。
秀丸エディタの置換で、数値部分のみを抽出したいと考えています。

(例)
http://www.abd.com/cat/
http://www.abd.com/cat/54678/
http://www.abd.com/cat/eco/
http://www.abd.com/cat/eco/as/458/index.php
http://www.abd.com/cat2/
http://www.abd.com/cat/5412578/
http://www.abd.com/cat/bs/5894/
http://www.abd.com/cat3/
・・・

正規表現を使ってこのように数値のみを抽出したいです。

54678
458
5412578
5894
・・・

検索してみましたがヒントになりそうなのはありませんでした。
ご教授いただければ幸いです。よろしくお願いいたします。

Aベストアンサー

検索文字列:[^0-9\n]|^\n
置換文字列:なし

なら、空行削除も含めて一発でできます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング