Tag: regex

Java:了解String replaceAll()方法

我想在这里找出这个问题的答案。 首先, blah[abc] = blah[abc].replaceAll(“(.*) (.*)”, “$2, $1”); 有人可以向我解释一下(。*),$ 2和$ 1是什么? 其次,当我在for语句中嵌套以便反转字符串的两个部分时,我遇到exception错误。 我想知道是否有人知道为什么会这样。 谢谢 编辑:这是我收到的错误 线程“main”中的exceptionjava.lang.ArrayIndexOutOfBoundsException:1在ChangeNames.main(ChangeNames.java:21)

使用正则表达式从文本中删除连续的重复单词并显示新文本

HY, 我有以下代码: import java.io.*; import java.util.ArrayList; import java.util.Scanner; import java.util.regex.*; / public class RegexSimple4 { public static void main(String[] args) { try { Scanner myfis = new Scanner(new File(“D:\\myfis32.txt”)); ArrayList foundaz = new ArrayList(); ArrayList noduplicates = new ArrayList(); while(myfis.hasNext()) { String line = myfis.nextLine(); String delim = ” “; String [] words = line.split(delim); […]

如何匹配字符串中的中间字符与正则表达式?

在奇数长度字符串中,您如何匹配(或捕获)中间字符? 这可能与PCRE, 普通 Perl或Java正则表达式有关吗? 使用.NET正则表达式,您可以使用平衡组轻松解决它(这可能是一个很好的例子)。 通过普通的Perl正则表达式,我的意思是不使用任何代码结构,如(??{ … }) ,您可以使用它来运行任何代码,当然也可以做任何事情。 该字符串可以是任何奇数长度。 例如,在字符串12345您需要获取字符串中心的3字符。 这是关于现代正则表达式风格的可能性的问题,而不是以其他方式做到这一点的最佳算法。

枚举Java中正则表达式的可能匹配项

我想在Java中枚举有限正则表达式的所有可能值以用于测试目的。 对于某些上下文,我有一个正则表达式,我用它来匹配单词中允许的颜色值。 这是一个缩短版本的例子: (white|black)|((light|dark) )?(red|green|blue|gray) 我想创建一个unit testing,它将枚举所有这些值并将它们传递给我的实用程序类,该实用程序类从这些中生成一个Color对象,这样,如果我更改正则表达式,我的unit testing将在发生错误时失败(即新颜色值不受支持)。 当然,我知道枚举是可能的( 参见这个问题 ),但是现有的Java库是否会枚举正则表达式的所有可能的匹配? 编辑:我已经实现了一个执行此操作的库。 请参阅下面的答案以获取链接。

使用Java替换阿拉伯语推文中的表情符号Unicode范围

我试图用java替换阿拉伯语推文中的表情符号。 我用过这段代码: String line = “اييه تقولي اجل الارسنال تعادل امس بعد ما كان فايز 😂😂”; Pattern unicodeOutliers = Pattern.compile(“([\u1F601-\u1F64F])”, Pattern.UNICODE_CASE | Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE); Matcher unicodeOutlierMatcher = unicodeOutliers.matcher(line); line = unicodeOutlierMatcher.replaceAll(” $1 “); 但它并没有取代它们。 即使我只匹配字符本身“\ u1F602”,它也不会取代它。 可能是因为它是你之后的5位数?! 我不确定,只是一个猜测。 注意: 1-推特结束时的情绪(😂)是“U + 1F602”,即“面对欢乐的泪水” 2-这个问题与这个问题不重复。 有任何想法吗?

使用`\ R`进行Java-8正则表达式负向观察

在回答另一个问题时 ,我写了一个正则表达式来匹配所有空格,最多包括一个换行符。 我使用负面的lookbehind为\R linebreak matcher做了这个: ((?<!\R)\s)* 后来我在考虑它,我说,哦,不,如果有\r\n ? 当然它会抓住第一个破线字符\r \n然后我会被我的下一个字符串前面的虚假\n卡住,对吗? 所以我回去测试(并且可能修复)它。 但是,当我测试模式时,它匹配整个\r\n 。 它与人们可能期望的\r \n离开\n不匹配。 “\r\n”.matches(“((?<!\\R)\\s)*"); // true, expected false 但是,当我使用\R 文档中提到的“等效”模式时,它返回false。 这是Java的一个错误,还是有匹配的正当理由?

如何将String拆分为字符串流?

将String拆分为流的最佳方法是什么? 我看到了这些变化: Arrays.stream(“b,l,a”.split(“,”)) Stream.of(“b,l,a”.split(“,”)) Pattern.compile(“,”).splitAsStream(“b,l,a”) 我的优先事项是: 稳健性 可读性 性能 一个完整的,可编译的例子 : import java.util.Arrays; import java.util.regex.Pattern; import java.util.stream.Stream; public class HelloWorld { public static void main(String[] args) { stream1().forEach(System.out::println); stream2().forEach(System.out::println); stream3().forEach(System.out::println); } private static Stream stream1() { return Arrays.stream(“b,l,a”.split(“,”)); } private static Stream stream2() { return Stream.of(“b,l,a”.split(“,”)); } private static Stream stream3() { return Pattern.compile(“,”).splitAsStream(“b,l,a”); } […]

为什么(。*)*制作两个匹配并在组$ 1中不选择任何内容?

这是因为关于forms化正则表达式语法的讨论。 我已经看到了几个正则表达式解析器的这种行为,因此我标记它与语言无关。 采用以下表达式(根据您喜欢的语言调整它): replace(“input”, “(.*)*”, “$1”) 它将返回一个空字符串。 为什么? 更奇怪的是,表达式replace(“input”, “(.*)*”, “A$1B”)将返回字符串ABAB 。 为什么双空配对? 免责声明:我知道回溯和贪婪的比赛,但杰弗里弗里德所规定的规则似乎决定了.*匹配一切,没有进一步的回溯或匹配。 那为什么$1是空的? 注意:与(.+)* ,返回输入字符串。 然而, http://regexhero.com显示仍有两场比赛,由于与上述相同的原因,这似乎很奇怪。

正常表达SSN和电话号码

该字符串不应包含SSN或电话号码。 下面的正则表达式不起作用,它只接受xxxxxxxxx格式。 不应包含xxx-xx-xxxx或xxx-xxx-xxx或xxxxxxxxx 。 regex = “^((?!\\d[9]$)|(?!(\\d{3}-?\\d{2}-?\\d{4}$)|(?!(\\d{3}-?\\d{3}-?\\d{3})$)$”;

Java Regex – Ilegal Repetition字符

我的正则表达式是 (?:–|#|\/\*|{) 当我使用Java中的Pattern.complie()编译它时,我得到* 非法重复字符* 我测试了这个正则表达式 (a|\/\*|b) 当我编译它时,它显示没有错误。 为什么会这样?