0

私はJSFを使用しています。検証用のコードを使用:

<h:inputText id="sender" value="#{contactForm.sender}">
      <f:validateRegex pattern="([a-zA-Z_0-9]).{4,32}" />
</h:inputText>

文字列を入力すると: abc. 結果は無効です。良い。次に、 abcd@ と入力します。その文字列には@文字が含まれているため、その文字列は無効だと思いました。しかし、私はメッセージを受け取りません。つまり、文字列は有効です。正規表現について明確に理解していません。手伝ってくれますか?

4

2 に答える 2

2

.入力文字列の任意の文字に一致するメタ文字をエスケープするのを忘れました

([a-zA-Z_0-9]).{4,32}
//            ^
//            |
//            |
//        Notice the dot . this matches any character

したがって、正規表現は、小文字、大文字、アンダースコア_、またはその間の数字で始まり09その後に 4 ~ 32 回繰り返される任意の文字が続く任意の文字列に一致するため、これはほとんどすべてに一致します。

これを修正するには、ドットをエスケープし.て最初のグループに含める必要あります\w[a-zA-Z_0-9]

([\w\.]){4,32}

そうしないと、式は以前と同じで始まるが 4 ~ 32 個の.ドットを含む任意の文字列と一致しますが、現在は、アルファベット文字、数字、ドット、または長さのあるアンダースコアを含む任意の文字列と一致します。 4 ~ 32 文字。

于 2013-08-22T15:20:56.153 に答える
2

<f:validateRegex>クライアント側ではなく、サーバー側です。<h:messages>これを含むフォームを投稿して送信<h:inputText>し、コンポーネントの間違った値に対して生成されたメッセージを確認しsenderます。

例:

<h:form>
    Input the data:
    <h:inputText id="sender" value="#{contactForm.sender}">
        <f:validateRegex pattern="([a-zA-Z_0-9]).{4,32}" />
    </h:inputText>
    <h:commandButton value="Submit" />
    <h:messages />
</h:form>

コメントでBalusCが示唆しているようにonkeyup、入力のイベントにajaxを使用して検証を開始できます。

<h:form>
    Input the data:
    <h:inputText id="sender" value="#{contactForm.sender}">
        <f:validateRegex pattern="([a-zA-Z_0-9]).{4,32}" />
        <f:ajax event="keyup" render="messageId" />
    </h:inputText>
    <h:message id="messageId" for="sender" />
</h:form>

また、DavidStarkey がコメントに投稿したように、正規表現は と一致しabcd@ます。正規表現の一部としてドット ( ) を使用する場合は、その前に.バックスラッシュ ( ) を使用します。\

<f:validateRegex pattern="([a-zA-Z_0-9])\.{4,32}" />

より詳しい情報:

于 2013-08-22T15:16:53.733 に答える