用于自定义解析的正则表达式

时间:2015-07-29 19:20:41

标签: regex

正则表达式不是我最强的观点。假设我需要一个字符串的自定义解析器,它可以删除任何字母和多个小数点和字母表的字符串。

例如,输入字符串为“--1-2.3-gf5.47”,解析器将返回 “-12.3547”。 我只想出各种变化:

string.replaceAll("[^(\\-?)(\\.?)(\\d+)]", "")

删除字母但保留其他所有内容。有什么指针吗?

更多例子: 输入:-34.le.78-90 输出:-34.7890

输入:df56hfp.78 产量:56.78

一些规则:

  • 只考虑第一个数字前的第一个负号,其他一切都可以忽略。
  • 我正在尝试使用Java。
  • 假设-ve符号(如果有的话)将始终出现在 小数点。

2 个答案:

答案 0 :(得分:1)

刚刚在ideone上测试了它,它似乎工作。评论应该很好地解释代码。您可以将其复制/粘贴到Ideone.com中,如果您愿意,可以对其进行测试。

也许有可能为它编写一个正则表达式模式,但是你可能更好地实现更简单/更可读的东西,如下所示。

你给出的三个例子打印出来:

--1-2.3-gf5.47   ->   -12.3547
-34.le.78-90     ->   -34.7890
df56hfp.78       ->    56.78
import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(strip_and_parse("--1-2.3-gf5.47"));
        System.out.println(strip_and_parse("-34.le.78-90"));
        System.out.println(strip_and_parse("df56hfp.78"));
    }

    public static String strip_and_parse(String input)
    {
        //remove anything not a period or digit (including hyphens) for output string
        String output = input.replaceAll("[^\\.\\d]", "");

        //add a hyphen to the beginning of 'out' if the original string started with one
        if (input.startsWith("-"))
        {
            output = "-" + output;
        }

        //if the string contains a decimal point, remove all but the first one by splitting
        //the output string into two strings and removing all the decimal points from the
        //second half           
        if (output.indexOf(".") != -1)
        {
            output = output.substring(0, output.indexOf(".") + 1) 
                   + output.substring(output.indexOf(".") + 1, output.length()).replaceAll("[^\\d]", "");
        }

        return output;
    }
}

答案 1 :(得分:0)

就正则表达式而言,二级,三级等小数似乎难以删除。但是,这个应删除其他短划线和alpha:(?<=.)-|[a-zA-Z]。 (希望Java中的语法相同;这是一个Python正则表达式,但我的理解是语言相对统一)。

话虽这么说,似乎你可以运行一个非常简短的有限状态机&#34;类型的代码来扫描字符串并自己重建减少的字符串:

a =  "--1-2.3-gf5.47"
new_a = ""
dash  = False
dot   = False
nums  = '0123456789'
for char in a:
    if char in nums:
        new_a = new_a + char  # record a match to nums
        dash  = True  # since we saw a number first, turn on the dash flag, we won't use any dashes from now on
    elif char == '-' and not dash:
        new_a = new_a + char  # if we see a dash and haven't seen anything else yet, we append it
        dash  = True  # activate the flag
    elif char == '.' and not dot:
        new_a = new_a + char  # take the first dot
        dot   = True  # put up the dot flag

(再次,抱歉语法,我认为你需要一些关于语句的补充说明而不是Python的缩进样式)