匹配字符串中的可选域

时间:2018-02-01 19:10:21

标签: javascript regex substring

我已经在这个JS正则表达式上绞尽脑汁,到目前为止只能使部分工作或整个事情在某些情况下工作。

我有一个这样的字符串:

Some string<br>http://anysubdomain.particulardomain.com<br>Rest of string

目标是将域部分移动到字符串的末尾,如果它在那里。 http部分也是可选的,也可以是https。 TLD始终是specialdomain.com,子域可以是任何东西。

当这个正则表达式中存在带协议的域时,我已设法将所有内容都放入捕获组中:

(.*)(https?\:\/\/[a-z\d\-]*\.particulardomain\.com)(.*)

但是任何使域名部分和协议部分成为可选项的尝试都会导致没有或错误的匹配。

我正在寻找的最终结果是将字符串的三个部分 - 开头,域,结尾 - 放在单独的捕获组中,这样我就可以将捕获组2(域部分)移动到最后,或者,如果没有域存在,则第一个捕获组中的整个字符串。

为了澄清,以下是预期输出/捕获组的一些示例:

INPUT:

Some string<br>http://anysubdomain.particulardomain.com<br>Rest of string

OR(无协议):

Some string<br>anysubdomain.particulardomain.com<br>Rest of string

输出:

$1: Some string<br>
$2: http://anysubdomain.particulardomain.com
$3: <br>Rest of string

INPUT:

Some string<br>Rest of string

输出:

$1: Some string<br>Rest of string
$2: empty
$3: empty

3 个答案:

答案 0 :(得分:0)

我在这里看到了很好的答案,因为您解释说您需要三个组并将域设置为字符串的后面(要清除整个URL或仅显示域名,例如,特定域名网站)

你可以这样做:

//Don't know if the  <br> tag matter for you problem, suppose it not
//this is you input 
let str = "Start of string 1234<br>https://subdomain.particulardomain.com<br>End of string 99";

let group = str.split(<br>);
let indexOfDomain;
 /*moere code like a for loop or work with a in-build funcion of the array with the regExp you made /[a-z\d\-:\/]+\.particulardomain\.com/ you can validated the domain separately.

}

有心情:

你的解决方案不能100%工作,为什么?

你的regExp:

([a-z\d\-:\/]+\.particulardomain\.com)(.*)

将运行http,https,*(任何其他不是协议的东西)并且不适用于此输入,您可以测试是否喜欢并做评论 Start of string 1234<br>End of string 999

@Valdi_Bo回答的regExp:

(.*?)((https?:)?\/\/[a-z\d\-]+\.particulardomain\.com)(.*)

将适合您在问题中描述的内容

此regExp不适合您的所有输入,也许他没有为您的所有输入进行测试,因为您没有在问题中解释,就像您在自己的答案中所做的那样

总之,最后你需要提取域名(当你混淆这个想法时,不知道是否是整个网址)。如果你不打算使用分割然后验证regExp它会更容易

答案 1 :(得分:0)

正则表达式中的一个错误是它只包含particular 源文本包含particulardomain,但这是一个细节。

现在让我们转到协议部分。您只放了一个?s之后), 这意味着 s是可选的,但http:都是 仍然需要。

要使整个协议可选,您必须:

  • 用一个组(捕获或不捕获)包围它,
  • 将此论坛设为可选(将?放在其后)。

现在也许是最重要的事情:你的正则表达式以(.*)开头。 请注意,它是贪婪版本,其中:

  • 最初尝试捕获源字符串的其余部分,
  • 然后向后移动一个char,以允许匹配 以下是正则表达式的一部分。

将其更改为不情愿版本(.*?),然后可选 小组(https?:)?将按预期匹配。

另一个细节:\之前不需要:。它没有 任何伤害,但由于“保持简单...”的原则, 我建议删除它(如上所述)。

还有一个细节:在你应该放置[a-z\d\-](子域名部分)之后 +,而不是*,因为此部分可能不是空的。

所以整个正则表达式可以是:

(.*?)((https?:)?\/\/[a-z\d\-]+\.particulardomain\.com)(.*)

最后一句话:我有疑问,你是否真的需要 捕获组。也许只留下内容就足够了 中间捕获组,即:

(https?:)?\/\/[a-z\d\-]+\.particulardomain\.com

答案 2 :(得分:0)

找到解决方案。因为,如上所述,目标是将域移动到字符串的末尾,如果它存在,我只是匹配域及其后的任何内容。如果没有域名,则没有任何内容匹配,因此没有任何内容被替换。问题是两个。*都在正则表达式的开头和结尾。只需要最后一个。

REGEX:

([a-z\d\-:\/]+\.particulardomain\.com)(.*)

适用于以下字符串:

现场:

Start of string 1234<br>https://subdomain.particulardomain.com<br>End of string 999

没有协议的域名:

Start of string 1234<br>subdomain.particulardomain.com<br>End of string 999

没有域名:

Start of string 1234<br>End of string 999

感谢大家帮我重新思考这个问题!