プロが教える店舗&オフィスのセキュリティ対策術

javascript言語の問題に下のような問題がありましたが、よくわかりませんでした。

文字列の中から電話番号(の数字部分だけ)を取り出す関数を作成する。
function denwa(s)
{
var k;
k = s.match(/([0-9]{3})-([0-9]{4}/);
if(k != null)
{
return k[1]+k[2];
}
return"not found";
}
var adres, i;
adres = [
"taro 234-1111",
"jiro 34-2222",
"sburo (987)3333",
"haruko 080(333)4444 keitai",
"natuko,0789(555)6666,jitaku",
"akiko03-1234-5678office"
];
for(i in adres)
{
print(denwa(adres[i]));
}

アドレス帳(配列 address)には6人分のデータがあり、for in文を使い順次関数を呼びだす、
関数denwa では数字3桁の後ろにハイフンが続き、さらに数字4桁が続くパターンを使ってマッチングを行っている。taroさんの結果は正しく表示されるが、ほかのデータに対しては望んだ結果が得られない。

[実行例]
2341111
not found

上のものを修正し、市街局番を含め6人分の書き方に対応させるにはどうすればよいでしょうか?

A 回答 (3件)

function denwa(s)


{
var k = s.match(/(\d{2,4})/g);
if(k == null) return "not found";

var ret = '';
for(var i = 0; i < k.length; i++) ret += k[i];
return ret;
}

var i;
var adres = [
"taro 234-1111",
"jiro 34-2222",
"sburo (987)3333",
"haruko 080(333)4444 keitai",
"natuko,0789(555)6666,jitaku",
"akiko03-1234-5678office"
];
for(i in adres)
{
print(denwa(adres[i]));
}
    • good
    • 0

> "taro 234-1111",


> "jiro 34-2222",
> "sburo (987)3333",
> "haruko 080(333)4444 keitai",
> "natuko,0789(555)6666,jitaku",
> "akiko03-1234-5678office"

特定の言語での記述方法を考える前にまず、、、
「各行から電話番号を抜き出すということは具体的にどういう方法をとればよいか?」
「出力はどういう形式にするか」
の二つを考えることです。
この問題の場合、入力形式は決まっているので考える必要は無いと。
そしてその基本的な方針に沿って処理手順を具体的に日本語でまとめてみることです。これは頭の中だけでもよいです。

で。特定のプログラム言語で書かれたプログラムの意味を解する際も同様です。
この問題の場合プログラムにさせたいこと(=入力と出力)はわかっているわけで、それを実現するには「自分ならこうするなぁ」というのがある程度頭にあった上で問題のプログラムを見ると、「やっぱりそうか」とか「ん? これは俺の考えと違う」というようなことがあって「このプログラムはこういうことをやっているのか」と読み解けると。。。
しかもプログラムを実行した結果(入力データの1個目しか要求仕様とおりに動かない)も示されているのですから、「これじゃこの結果になるよね」という原因の在りかも読み取りやすいと思います。
    • good
    • 0

function denwa(s){


var k,ret;
s = s.replace(/(\d)[\(\)](\d)/g,"$1-$2"); // 数字の間の括弧 '(', ')' をハイフン'-'に置換
k = s.match(/(?:(\d{1,4})-)?(\d{1,4})-(\d{4})/);
if(k != null){
if(k[1] != undefined){ret = k[1]+k[2]+k[3];}
else{ret = k[2]+k[3];}
return ret;
}else{
return "not found";
}
}
var adres, i;
adres = [
"taro 234-1111",
"jiro 34-2222",
"sburo (987)3333",
"haruko 080(333)4444 keitai",
"natuko,0789(555)6666,jitaku",
"akiko03-1234-5678office"
];
for(i in adres){
document.writeln(denwa(adres[i]));
}
</script>

このような感じでいかがでしょうか?
やってることは、数字の間の括弧をハイフンに変更してからmatchしています
"taro 234-1111" → "taro 234-1111"
"jiro 34-2222" → "jiro 34-2222"
"sburo (987)3333" → "sburo (987-3333"
"haruko 080(333)4444 keitai" → "haruko 090-333-4444 keitai"
"natuko,0789(555)6666,jitaku" → natuko,0789-555-6666,jitaku"
"akiko03-1234-5678office" → akiko03-1234-5678office"

市外局番等の部分はオプションでマッチさせることで、省略してもしなくてもマッチさせることができます
    • good
    • 0

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