Java正则表达式将String拆分为数字数组

时间:2016-08-28 19:56:42

标签: java arrays regex

我有一个扫描仪字符串输入,格式如下:中午12:00:00。

我设法最终将PM或AM隔离开来:

:- op(400, fy , not).
:- op(500, xfy, and).
:- op(600, xfy, or ).
:- op(700, xfy, imp).
:- op(800, xfy, iff ).

distr(_, [], []).
distr([], _, []).
distr([C|Cs], Ds, Es) :- distr_un(C, Ds, Ss), distr(Cs, Ds, Ts), append(Ss, Ts, Es).
distr_un(_, [], []).
distr_un(C, [D|Ds], [E|Es]) :- append(C, D, E), distr_un(C, Ds, Es).

cnf(F, [[F]]) :- atom(F), !.
cnf(not(F), [[not(F )]]) :- atom(F), !.
cnf(not not F, Rs) :- cnf(F, Rs).
cnf(not (F imp G), Rs) :- cnf(F and not G, Rs).
cnf(not (F iff G), Rs) :- cnf((F and not G) or (not F and G), Rs).
cnf(not(F and G), Rs) :- cnf((not F) or (not G), Rs).
cnf(not(F or G), Rs) :- cnf((not F) and (not G), Rs).
cnf(F and G, Rs) :- cnf(F, Cs), cnf(G, Ds), append(Cs, Ds, Rs).
cnf(F or G, Rs) :- cnf(F, Cs), cnf(G, Ds), distr(Cs, Ds, Rs).
cnf(F imp G, Rs) :- cnf((not F) or G, Rs).
cnf(F iff G, Rs) :- cnf((not F or G) and (not G or F), Rs).

val(X,0) :- atom(X).
val(X,1) :- atom(X).
value(X, [val(X, B)|_], B) :- !.
value(X, [_|Ps], B) :- value(X, Ps, B), !.
value(not X, [val(X, B)|_], V) :- V is 1-B, !.
value(not X, [_|Ps], B) :- value(not X, Ps, B), !.
sp([],[]).
sp([F|Fs], Ss) :- setof(A1, member(not A1, F), R1), setof(A, (member(A,F), atom(A)), R),  sp(Fs, N), append(R,N,M1), append(M1, R1, M), setof(B,member(B,M),Ss), !.
sp([F|Fs], Ss) :- setof(A, (member(A,F), atom(A)), R),  sp(Fs, N), append(R,N,M), setof(B,member(B,M),Ss), !.
sp([F|Fs], Ss) :- setof(A, (member(not A,F), atom(A)), R),  sp(Fs, N), append(R,N,M), setof(B,member(B,M),Ss), !.
valuation([],[]).
valuation([A|As], [V|Vs]) :- (V = val(A,0); V = val(A,1)), valuation(As,Vs).
ext([F|Fs], Vs, B) :- sp([F|Fs], Ss), valuation(Ss, Vs), ext_([F|Fs], Vs, B).
ext_([], _, 1).
ext_([F|Fs], Vs, 1) :- cl(F, Vs, 1), ext_(Fs, Vs, 1).
ext_([F|Fs], Vs, 0) :- cl(F, Vs, 0); ext_(Fs, Vs, 0).
cl([A|As], Vs, 1) :- value(A,Vs,1); cl(As, Vs, 1).
cl([A|As], Vs, 0) :- value(A,Vs,0), cl(As,Vs,0).
cl([], _, 0).
model(F, Vs) :- ext(F, Vs, 1).
models(F, Vs) :- cnf(F, Fs), setof(V, model(Fs, V), Vs).
models(F, Vs) :- setof(V, model(F, V), Vs).

我知道我隔离PM或AM的方式不是最好的,所以希望有一种更好的方法可以获得一个完全一个字符串的数组。

但是当我为" nums"运行for循环时数组,输出为:

public class ConverTime
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        String timeString = sc.next();

        String[] pmOrAm = timeString.split("\\d");
        String[] nums = timeString.split("(: + \\D)");

        // PM or AM
        String timeType = pmOrAm[pmOrAm.length - 1];
        for (String n: nums)
        {
            System.out.println(n);
        }
    }
} 

我希望输出如此:

 12:00:00PM

没有" PM"或者" AM。"我该怎么做?

5 个答案:

答案 0 :(得分:3)

为了完整起见,虽然有分裂和正则表达式的良好解决方案,但还有另一个用于您的用例......

Data date = new SimpleDateFormat("HH:mm:ssaa").parse(s);
Calendar cal = new GregorianCalendar();
cal.setTime(date);
System.out.println( data.get(Calendar.HOUR);
System.out.println( data.get(Calendar.MINUTE);
System.out.println( data.get(Calendar.SECOND);

就像一个不同方向的想法一样,因为我们在这里谈论时间字符串,这将允许你对纯粹的正则表达式格式做出假设......

答案 1 :(得分:2)

像这样:

(\d+):(\d+):(\d+)(?:[AP]M)

请参阅a demo on regex101.com 请记住双重逃避Java中的反斜杠(即\\d+)。

答案 2 :(得分:2)

一种简单的方法可能是:

timeString.split("(AM|PM|:)")

希望有所帮助

答案 3 :(得分:1)

你必须使用String[] nums = timeString.split(":"); 并输出每个索引,如System.out.println(nums[0]); , nums[1] and nums[2],并删除你可以做的上午/下午String removeap = nums[2].substring(0, 2);

答案 4 :(得分:1)

我认为更正确的方法是在这里使用正则表达式而不是拆分。这样,您可以检测是否获得了意外的输入,而不是错误地处理字符串。

    String s = "12:01:02PM";
    Pattern pat = Pattern.compile("(\\d\\d):(\\d\\d):(\\d\\d)\\w\\w");
    Matcher matcher = pat.matcher(s);

    if (!matcher.matches()) {
        // Handle error...
    }

    int hh = Integer.valueOf(matcher.group(1));
    int mm = Integer.valueOf(matcher.group(2));
    int ss = Integer.valueOf(matcher.group(3));

    System.out.println(hh + ", " + mm + ", " + ss);