Tag: regex

如何否定Java中的任何正则表达式

我有一个我想要否定的正则表达式,例如 /(.{0,4}) 哪个String.matches返回以下内容 “/1234” true “/12” true “/” true “” false “1234” false “/12345” false 有没有办法否定(仅使用regx)以上结果,以便结果是: “/1234” false “/12” false “/” false “” true “1234” true “/12345” true 我正在寻找一种适用于任何regx的通用解决方案,而无需重写整个正则表达式。 我看过以下如何否定整个正则表达式? 使用(?!pattern),但这对我来说似乎不起作用。 以下regx (?!/(.{0,4})) 返回以下内容: “/1234” false “/12” false “/” false “” true “1234” false “/12345” false 这不是我想要的。 任何帮助,将不胜感激。

在DocumentFilter中使用正则表达式来解决JTextField问题

我在JTextField上使用DocumentFilter ,用于输入员工工作的时间。 filter是为了确保输入限制只有4个字符长,并且只允许数字。 可以使用或不使用小数,但只允许输入一次,输入小数后,应该只允许一个小数。 应接受9.5或10.5的含义,而不接受8.45。 到目前为止,我能够获得所需function的一半左右。 最多可输入4个字符,仅允许数字。 后者是使用replaceAll(“[^0-9.]”, “”)方法完成的。 我花了很多时间观看教程,阅读文档和相关问题,比如这个 , 这个 ,特别是这个,但似乎无法获得正则表达式。 特别是我无法弄清楚的一件事是为什么[^0-9]的正则表达式只能成功地允许数字,但^\\d除非作为字符类包含,例如[\\d] 我的filter代码如下: import java.awt.Toolkit; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; public class TimeWorkedFilter extends DocumentFilter { private int maxCharacters; public TimeWorkedFilter(int maxChars) { maxCharacters = maxChars; } //”[^0-9.] public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) throws BadLocationException { if […]

在正则表达式中使用反向引用来动态替换文本

我想像整数一样使用$ 1值。 我们的想法是使用等效的数组值替换originaltext中的所有数字并创建一个新文本。 下面想要的结果应该是“这是DBValue4,这是DBValue2,这是DBValue7” 另外,有没有办法保存这些反向引用以供进一步使用? String[] values = {“DBValue0″,”DBValue1″,”DBValue2″,”DBValue3″,”DBValue4″,”DBValue5″,”DBValue6″,”DBValue7″,”DBValue8″,”DBValue9″,”DBValue10”}; String originaltext = “This is 4, This is 2, This is 7”; text = originaltext.replaceAll(“(\\d)”,”$1″); // want something like text = originaltext.replaceAll(“(\\d)”,values[$1]); //or text = originaltext.replaceAll(“(\\d)”,values[Integer.parseInt(“$1”)]);

正则表达式中的奇怪行为

有一个关于正则表达式的问题并试图回答我发现了另一个奇怪的事情。 String x = “X”; System.out.println(x.replaceAll(“X*”, “Y”)); 这打印YY。 为什么?? String x = “X”; System.out.println(x.replaceAll(“X*?”, “Y”)); 这打印YXY 为什么不情愿的正则表达式与’X’字符不匹配? 有”noting”X”nothing”但为什么首先不匹配三个符号并匹配两个然后一个而不是三个? 和第二个正则表达式只匹配”nothing”而不是X ?

使用RegEx匹配大输入时的StackOverflowError

使用RegEx模式匹配结果时,我得到了StackOverflowError 。 模式是(\d\*?(;(?=\d))?)+ 。 此正则表达式用于validation输入: 12345;4342;234*;123*;344324 输入是一个字符串,由值(仅数字)分隔; 。 每个值最后可以包含一个* (用作其他匹配的通配符)。 没有; 在字符串的末尾。 问题是这个正则表达式工作正常,少数值。 但是当值的数量太大(超过300)时,它将导致StackOverflowError 。 final String TEST_REGEX = “(\\d\\*?(;(?=\\d))?)+”; // Generate string StringBuilder builder = new StringBuilder(); int number = 123456; for (int count = 1; count <= 300; count++) { builder.append(Integer.toString(number).concat(";")); number++; } builder.deleteCharAt(builder.lastIndexOf(";")) builder.toString().matches(TEST_REGEX); //<———- StackOverflowError 和堆栈跟踪: java.lang.StackOverflowError at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3715) at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556) […]

如何确保replaceAll将替换整个单词而不是subString

我有字典输入。 迭代字典以从文本中的字典替换key 。 但是replaceAll函数也替换了subString 。 如何确保它匹配整个单词(作为一个整体而不是作为子subString ) String text= “Synthesis of 1-(2,6-dimethylbenzyl)-1H-indole-6-carboxylic acid [69-3] The titled compound (883 mg) sdvfshd[69-3]3456 as a white solid was prepared” dictionary= {[69-3]=1-(2,6-dimethylbenzyl)-1H-indole-6-carboxylic acid } for(Map.Entry entry : dictionary.entrySet()){ text=text.replaceAll(“\\b”+Pattern.quote(entry.getKey())+”\\b”, entry.getValue()); }

Java正则表达式:否定前瞻

我正在尝试制作两个匹配URI的正则表达式。 这些URI的格式为: /foo/someVariableData和/foo/someVariableData/bar/someOtherVariableData 我需要两个正则表达式。 每个都需要匹配一个而不是另一个。 我最初提出的正则/foo/.+/bar/.+分别是:/ /foo/.+和/foo/.+/bar/.+ 。 我认为第二个正则表达式很好。 它只匹配第二个字符串。 然而,第一个正则表达式匹配两者。 所以,我开始玩(第一次)负向前瞻。 我设计了正则表达式/foo/.+(?!bar)并设置以下代码来测试它 public static void main(String[] args) { String shouldWork = “/foo/abc123doremi”; String shouldntWork = “/foo/abc123doremi/bar/def456fasola”; String regex = “/foo/.+(?!bar)”; System.out.println(“ShouldWork: ” + shouldWork.matches(regex)); System.out.println(“ShouldntWork: ” + shouldntWork.matches(regex)); } 当然,他们都决心要做到这一点。 谁知道我做错了什么? 我不需要使用Negative lookahead,我只需要解决问题,我认为负向前瞻可能是一种方法。 谢谢,

如何配置URL模式以使servlet和Struts2同时工作?

为什么我的过滤对我不起作用以及如何设置它起作用? 有我的web.xml : GameServlet GameServlet ajaxdemo.action.GameServlet 0 GameServlet /gameservlet struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* index.jsp 在此配置中, GameServlet不会收到任何内容,并且Web服务器报告没有/gameservlet URL的动作映射。 如果我评论filter映射,这个servlet可以通过此URL正常工作。 如何同时使用Strutsfilter和servletfilter,重点是servlet应该只使用/gameservlet URL,所有其他的应该由Struts处理。 我无法理解如何为我的案例创建URL模式。

如何从字符串中删除回车符

String s =”SSR/DANGEROUS GOODS AS PER ATTACHED SHIPPERS /DECLARATION 1 PACKAGE NFY /ACME CONSOLIDATORS” 如何剥离“PACKAGE”和“NFY”之间的空间?

java支持if-then-else regexp构造(Perl构造)吗?

尝试编译以下正则表达式时,我收到PatternSyntaxException: “bd”.matches(“(a)?b(?(1)c|d)”) 这个正则表达式匹配bd和abc。 它与bc不匹配。 有任何想法吗? 谢谢。 好吧,我需要写正则表达式来匹配接下来的4个字符串: *date date* date date1*date2 不应该匹配: *date* date1*date2* *date1*date2 date** … 但这应该通过单一匹配来完成,而不是几个。 请不要发布以下答案: (date*date)|(*date)|(date*)|(date)