質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

2回答

3213閲覧

JavaScriptとC#の正規表現でチェックのかかり方に差が出る

youkan_17

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2018/08/03 13:22

Asp.Net Core2.0で開発をしているのですが、フォームの入力チェック
に正規表現を使っているのですが、クライアントサイドの検証とサーバーサイド
の検証のかかり方に差があり解決方法が分かっていない状況です。

JavaScriptとC#の正規表現どちらにも精通している方にご教授頂きたいです。

問題点

後述の正規表現で、クライアントサイドの検証では想定している通り「1行58文字、3行まで」
が出来ているのですが、サーバーサイドの検証では「1行57文字、3行まで」になってしまいます。

やりたいこと

textareaに「1行に58文字、3行まで」という条件で制限をかけたいです。

コード

C#

1RegularExpression("^(.{0,58})(\n.{0,58}|)(\n.{0,58}|)$")

環境等

Asp.Net Core2.0
Windows10
C#

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

前のスレッドで x_x さんが、

\n が 更新時に \r\n になってるのでしょうか?

とコメントされたとおり、JavaSript で取得する改行は \n だが、サーバーに送信されると \r\n になるということが、

クライアントサイドの検証では想定している通り「1行58文字、3行まで」が出来ているのですが、サーバーサイドの検証では「1行57文字、3行まで」になってしまいます。

ということの原因と思われます。

クライアント側とサーバー側での改行コードの違いについて詳しくは以下の記事が参考になると思います。

textarea は送信前と送信後で文字列の内容が変化する
https://qiita.com/s_osa/items/c791d98e673db3815a7e

つまり、textarea の改行コードは、JavaScript 側では LF (\n) となるが、サーバーに送信されると CRLF (\r\n) になるということです。

C# での正規表現ではメタ文字 '.' には '\r' が含まれるので、正規表現パターン ".{0,58}" では '\r' もマッチします。(ちなみに、'\n' はマッチしない)

今回の質問者さんの検証結果「1行58文字、3行まで」は、例えば、textarea に 58 文字入力した後改行しサーバーに送信したのだと思いますが、その場合サーバーが受け取る文字列は "...58文字...\r\n" となったはずです。

"...58文字...\r\n" は '\r' までは 59 文字ですので、質問者さんが使った正規表現パターン "(.{0,58})(\n...." にはマッチしないという結果になったのだと思います。

正規表現パターンで、'\n' または '\r\n' どちらもマッチするようにすれば望む結果が得られるのではないかと思います。

自分の ASP.NET MVC5 環境で、質問者さんのコードに少しだけ手を加えて(ちょっと疑問はありましたがなるべく変えないようにして)、以下のコードで試してみました。

[RegularExpression(@"^(.{0,5})((\n|\r\n).{0,5}|)((\n|\r\n).{0,5}|)$")]

質問者さんのコードとは、\n ⇒ (\n|\r\n) の変更、@ の追加、58 文字ではなく簡単のため 5 文字にした点が異なります。

結果、自分が試した限りでは、期待通りクライアント側でもサーバー側でも「1行5文字、3行まで」となりました。

質問者さんの方でもお試しください。

投稿2018/08/04 01:55

編集2018/08/04 03:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

改行コードの違い(\r\n と \n )によるものでは。
クライアントとサーバの改行コードを調べてみれば。

投稿2018/08/03 13:26

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

youkan_17

2018/08/03 13:35

早速のご回答ありがとうございます。 その点を疑って色々試したつもりだったのですが、 もう少し試行錯誤してみます。
退会済みユーザー

退会済みユーザー

2018/08/04 02:23

> 改行コードについては > https://qiita.com/daisy1754/items/0b65d0669c391f30784f > のページにある `[\n\r\u2028\u2029\u0085]` を使って指定して見ましたが 質問者さんの正規表現パターンの中の \n に代えて [\n\r\u2028\u2029\u0085] を使ってみたと言ってますか? そうだとすると、それで質問者さんの目的が果たせるはずはないですよ。また混乱・誤解を招きそうなのでレスしておきます。
youkan_17

2018/08/04 03:46

ありがとうございます! 別スレッドから最後まで丁寧に教えて頂いた SurferOnWwwさんにベストアンサーを付けさせて頂きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問