RegExp:缺少最后一个符号

时间:2016-11-25 11:35:18

标签: regex street-address

我写了一个正则表达式:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Yl1osaB {

    public static void main(String[] args) throws IOException {

        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("Ylesanne 1 RASMUS RIKKEN 25/11/2016");

        while (true) {

            // your code

            if(tulemus < 0 || tulemus > 110) {
                System.out.println("Tulemus is wrong, please try again!");
            }
            else {
                break;
            }
        }

    } // MAIN
}

将字符串分为街道类型和街道名称。一些街道有街道位置描述,我不想选择。

这是: https://regex101.com/r/j3gF5b/2

它有效,但街道名称中的每个最后一个符号都缺失。我想知道为什么会发生这种情况以及如何修复它?

3 个答案:

答案 0 :(得分:2)

您的[^)]只匹配1个不是)的字符...这是您在街道名称中丢失的字母

你可以用这个:

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s([^\)]+?)$

答案 1 :(得分:1)

原因是否定字符类仍然消耗匹配的子字符串。断言字符串/行的结束后,使用否定lookbehind (零宽度断言,非消费构造):

)

所有以^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)(?!.*\)$)\s*(.+)$ 结尾的匹配都会失败。

请参阅regex demo

另一种方法是使用否定前瞻(如果正则表达式引擎不支持lookbehinds,如在JavaScript中):

#tableid// your table id

 var $tr = $("#tableid").append('<tr>' +
                    $('<td>').text(item.NAME),
                    $('<td>').text(item.POST_URL),
                    $('<td>').text(item.POST_DATE)
                    + '</tr>'
                    );

请参阅another demo

答案 2 :(得分:1)

将其放入捕获组(最终也排除换行符):

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s(.*[^)\r\n])$

demo

如果您只想丢弃位置说明并保留其余部分:

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s([^(\s]*(?:\h+[^(\s]+)*)

demo