gpt4 book ai didi

带有文档过滤器的 Java REGEX

转载 作者:行者123 更新时间:2023-12-05 07:27:48 24 4
gpt4 key购买 nike

我一直在尝试找出一个 REGEX 表达式,它可以过滤不是 '-' 或 0-9 的字符。此表达式将与文档过滤器一起使用,该过滤器将过滤插入到 JTextFields 中的字符。让我更详细地解释一下......

当用户在 JTextField 中输入字符时,DocumentFilter 使用 DocumentFilter 类中的 replace 方法检查输入。因为每次插入字符时都会调用该方法,所以 REGEX 需要能够在用户构建字符串时处理整数的一部分。例如,

Key Press 1): Value = '-' PASS
Key Press 2): Value = '-1' PASS
Key Press 3): Value = '-10' PASS etc...

但是过滤器不应允许组合 '-0' 或 '--' 并且应该通过以下情况,

仅限负号('-')

'-' 旁边没有零的负数('-01' 失败)

正值(0122和122通过)

这是我的代码:

package regex;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class CustomFilter extends DocumentFilter {

private String regex = "((-?)([1-9]??))(\d)";

/**
* Called every time a new character is added.
*/
@Override
public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {

String text = fb.getDocument().getText(0, fb.getDocument().getLength());
text += string;

if(text.matches(regex)) {
super.insertString(fb, offset, string, attr);
}
}

/**
* Called when the user pastes in new text.
*/
@Override
public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {

String string = fb.getDocument().getText(0, fb.getDocument().getLength());
string += text;

if(string.matches(regex)) {
super.replace(fb, offset, length, text, attrs);
}
}

@Override
public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
super.remove(fb, offset, length); // I may modify this later
}
}

如果您认为我的方向有误,请告诉我。我愿意接受更简单的选择。

最佳答案

而不是所有的交替,把它分解成这个

"^(?=[-\\d])(?:-(?!0))?\\d*$"

解释

 ^                             # Beginning of string
(?= [-\d] ) # Must be a character in it
(?: # Optional minus sign
-
(?! 0 ) # If not followed by 0
)?
\d* # Optional digits [0-9]
$ # End of string

模组:

通过一些额外的努力,您可以获得
中的部分有效字符串捕获第 1 组和第 2 组中任何剩余的无效尾随字符

所有这一切都需要测试是否存在匹配。
当然,您需要匹配器来获取组。

可能的结果:

  1. 正则表达式不匹配,字符串为空。
    行动:不采取任何行动。
  2. 正则表达式匹配。
    一个。操作:如果第 2 组的长度 > 0,写入文本字段
    第 1 组字符串,并将光标放在末尾。
    b。行动:如果第 2 组的长度 == 0,则不采取任何行动,输入正确。

"^(?=.)((?:-(?>(?=0)|\\d*)|\\d*))(.*)$"

https://regex101.com/r/oxmZfa/1

解释

 ^                             # Beginning of string

(?= . ) # Must be a character in the string

( # (1 start), Template for pattial validity
(?:
- # The case for minus
(?> # Atomic group for safety
(?= 0 ) # Don't capture 0 if it's ahead
| # or,
\d* # Any digits, 0 won't be first
)
| # or, the case for No minus
\d* # Any digits
)
) # (1 end)

( .* ) # (2), This is to be trimmed, stuff here doesn't match the template

$ # End of string

当用户提交文本时,使用此正则表达式来验证输入。
如果不匹配,说明用户没有在字段中添加数字。
只是弹出输入不完整的消息。

"^(?=[-\\d])(?:-(?!0))?\\d+$"

关于带有文档过滤器的 Java REGEX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53824884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com