Javascript 如何为不确定长度的输入指定正则表达式?

Javascript 如何为不确定长度的输入指定正则表达式?,javascript,regex,Javascript,Regex,一般来说,我试图熟悉正则表达式,特别是JavaScript正则表达式。这是为了我的学习,我知道字符串函数的存在是为了解决给定的问题 在一个长度不定的字符串中,我试图选择所有在开头和结尾字符中找到的字符。例如: 输入: 线串(-83.1732840000000000 40.0046110000000000, -83.1733380000000040.0048360000000000)行字符串(-83.1733380000000040.0048360000000000,-83.17219000000

一般来说,我试图熟悉正则表达式,特别是JavaScript正则表达式。这是为了我的学习,我知道字符串函数的存在是为了解决给定的问题

在一个长度不定的字符串中,我试图选择所有在开头和结尾字符中找到的字符。例如:

输入:

线串(-83.1732840000000000 40.0046110000000000, -83.1733380000000040.0048360000000000)行字符串(-83.1733380000000040.0048360000000000,-83.172190000000000 40.00490800000000)线串(-83.1733380000000000-40.004836000000000,-83.1721900000000-40.00490800000000)线串(-83.1733380000000000-40.004836000000000,-83.1721900000000-40.00490800000000)

所需输出:

(-83.1732840000000000-40.0046110000000000,-83.1733380000000000 40.0048360000000000) (-83.1733380000000000 40.0048360000000000, -83.1721910000000000 40.0049080000000000) (-83.1733380000000000 40.0048360000000000, -83.1721910000000000 40.0049080000000000) (-83.1733380000000000 40.0048360000000000, -83.1721910000000000 40.004908000000)

我对regex有限的了解使我相信以下方法应该有效:

patNew = new RegExp("(\(.*\)(?=[LINESTRING]))", "g");
但它会产生以下输出:

[“线串(-83.1732840000000000 40.0046110000000000, -83.1733380000000040.0048360000000000)行字符串(-83.1733380000000040.0048360000000000,-83.172190000000000 40.00490800000000)线串(-83.17333800000000 40.004836000000000,-83.1721900000000-40.00490800000000)“线串(-83.17328400000000000-40.0046110000000000,-83.1733380000000000-40.004836000000000)线串(-83.1733380000000000-40.004836000000000,-83.1721900000000-40.00490800000000)线串(-83.17333800000000 40.0048360000000000,-83.1721910000000000 40.004908000000000),“线串(-83.17328400000000000 40.0046110000000000,-83.1733380000000000 40.0048360000000000)线串(-83.1733380000000000 40.0048360000000000,-83.1721900000000 40.0049800000000000)线串(-83.17333800000000 40.0048360000000000,-83.1721910000000000000 40.004908000000000)LINESTRIN“]

我遗漏了什么?请帮我解释一下。另外,我在rubular.com上试用过,它接近我需要的。这是rubular上的输出

(-83.1732840000000000-40.0046110000000000,-83.1733380000000000 40.0048360000000000)线串(-83.17333800000000 40.0048360000000000,-83.172190000000000 40.004908000000000)线串(-83.17333800000000 40.0048360000000000,-83.172190000000000 40.00490800000000)

在rubular上,“LINESTRING”的第二个和第三个实例出现在选择中;为什么

我知道最后一段没有被选中,因为它的右大括号后面没有“LINESTRING”。这是正确的解释吗

如何选择“所有内容”b/w()并在长度不定的字符串中省略LINESTRING?另外,如何解释最后一部分


谢谢。

您创建的正则表达式不正确:

patNew = new RegExp("(\\(.*\\)(?=[LINESTRING]))", "g");
你需要在反斜杠上加倍用力

或者,使用本机正则表达式语法:

patNew = /(\(.*\)(?=[LINESTRING]))/g;

您确实需要用反斜杠转义中的括号,但如果您从中创建正则表达式,还需要用字符串文字转义中的反斜杠:

var patNew = /(\(.*\)(?=[LINESTRING]))/g;
// or
var patNew = new RegExp("(\\(.*\\)(?=[LINESTRING]))", "g");
我强烈建议使用regex文本,它更具可读性

顺便说一句,没有理由在整个正则表达式周围创建一个捕获组,而且您肯定不想要
[LINESTRING]
要成为一个文本字符串,您还需要转义括号。并且您需要进行转换,否则您将从第一个开口到第二个到最后一个闭合括号进行匹配。此外,通过这种前瞻性,您将不会得到最后一个组-后面不再有
LINESTRING
,因此请允许作为替代项我要么放弃它

var patNew = /\(.*?\)(?=LINESTRING|$)/g;

尽管如此,对于您的实际问题,匹配
/\([^)]*\)/g
应该足够了。

如果您的需求实际上只是
)之间的所有内容。
这个简单的模式应该可以做到这一点


LINESTRING在这里代表什么?它与解析相关吗?

您需要发布实际使用正则表达式的代码。也许([^]*)会更好?@hank:LINESTRING是后面几何体类型的标记。我需要解析的输入将具有这些标记。但出于其他目的,我需要去掉标记(LINESTRING),并选择带有括号的内容。@hank。你的解决方案有效。非常感谢你。关于细节,我给了贝基正确的答案。再次感谢。非常感谢你的详细解释。你的解决方案有效。我认为你的答案是正确的,因为我解释得很透彻。谢谢。