首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript替换部分子字符串不像预期的那样工作吗?

问Javascript替换部分子字符串不像预期的那样工作吗?
EN

Stack Overflow用户
提问于 2022-12-04 16:47:35
回答 4查看 31关注 0票数 1

我在处理时间和经络问题。

我可以使用'2:0 a. m.'、'2:0 am'、'3:0 p. m.'或'3:0 pm',基本上,当第二个发生时,我要做的是首先转换。

我的尝试:

代码语言:javascript
复制
console.info('2:0 a. m.'.replace(/(.*?\s)([ampAMP]*?)/, "$1")); // 2:0 a. m.

这个我真的不明白..。

代码语言:javascript
复制
'2:0 a. m.'.replace(/(.*?\s)([ampAMP]).*?([ampAMP])/, "$1"); // 2:0 .

这个很好用,但看起来很奇怪,不确定这是不是最好的方法

代码语言:javascript
复制
'2:0 a. m.'.replace(/(.*?\s)([ampAMP]).*?([ampAMP]).*?$/, "$1$2$3");

我几乎无法从时间中删除子午线,但是在第一个空格之后我如何替换所有不匹配[aAmMpP]的字符呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-12-04 17:04:44

如果要匹配am或pm,则使用[ampAMP]只匹配单个字符。如果您使用它两次,那么您将允许使用mm,它不是有效的格式。

您可以使模式匹配更多的变化,并捕获您想要保留的内容。然后,在替换中,使用捕获组创建所需的格式。

如果指定点是强制性的:

代码语言:javascript
复制
\b(\d{1,2})\s*:\s*(\d{1,2})\s*([ap])\.\s*m\.
  • \b A字界
  • (\d{1,2})捕获组1,匹配1-2位数字
  • 可选空格字符之间的\s*:\s*数学:
  • (\d{1,2})捕获组2,匹配1-2位数字
  • \s*匹配可选空格字符
  • ([ap])捕获组3,匹配a或b
  • \.\s*m\.匹配.可选空格字符、m和.

看一个regex演示。

在替换使用中(正如您已经知道的,您已经匹配了m字符)

代码语言:javascript
复制
$1:$2 $3m

​

代码语言:javascript
复制
const regex = /\b(\d{1,2})\s*:\s*(\d{1,2})\s*([ap])\.\s*m\./;
[
  "2:0 a. m.",
  "2:0 p. m.",
  "3:0 p. m.",
  "3:0p.m.",
  "2:0 am"
].forEach(s => console.log(s.replace(regex, "$1:$2 $3m")));

​

更多的时间,比如特定的模式,允许为秒部分提供一个可选的数字0-5:

代码语言:javascript
复制
\b([0-1]?[0-9]|2[0-3])\s*:\s*([0-5]?[0-9])\s*([ap])\.\s*m\.

Regex演示

票数 2
EN

Stack Overflow用户

发布于 2022-12-04 16:56:30

就目前而言,经过多次尝试,这种方法虽然不太干净,但仍然有效。

​

代码语言:javascript
复制
let time = "02:00 p. m.";
time = time.replace(/(.*?\s)([ampAMP]).*?([ampAMP]).*?$/, "$1$2$3");
console.log(time);

​

带着我选择的答案

​

代码语言:javascript
复制
let time = "02:00 a. m.";
time = time.replace(/\b(\d{1,2})\s*:\s*(\d{1,2})\s*([ap])\.\s*m\./i, "$1:$2 $3m");
console.log(time);

​

但顺便说一句我最后还是这么做了

​

代码语言:javascript
复制
let time = "02:00 a. m.";
time = time .replace(/\.\s*/g, "");
console.log(time);

​

因为虽然很好,但我的表现有问题。

希望它能帮上忙

票数 1
EN

Stack Overflow用户

发布于 2022-12-04 16:57:43

以取代“上午”案文。或者用"am“和文本"p”来表示"am“。或者字符串中带有"pm“的"pm”,可以使用以下正则表达式:

/^(.?\s)(a.\sm\p.\s*m)/g

这个正则表达式将与文本“a.m.”匹配。或字符串开头的"am“(由^字符表示),在任意数量的字符后面加上空格(由.*?\s模式指示)。它还将匹配文本“下午”。或者"pm“也是这样。

要在替换()方法中使用这个正则表达式,可以将它作为第一个参数传递,"am“或"pm”作为第二个参数,这取决于匹配的文本。例如:

替换(/^(.?\s)( a. \sm\s*m)/g,“$1 am”;//返回“凌晨2:0”

替换(/^(.?\s)(a.\sm\s*m)/g,“$1 1pm”;//返回"2:0“

编辑

以取代“上午”案文。或者用"am“和文本"p”来表示"am“。或者"pm“动态,您可以使用一个正则表达式与捕获组匹配字符串的"am”或"pm“部分,然后在替换字符串中使用捕获组。

下面是一个可以使用的正则表达式示例:

/^(.?\s)(a.\sm\p.\s*m)/g

这个正则表达式将与文本“a.m.”匹配。或字符串开头的"am“(由^字符表示),在任意数量的字符后面加上空格(由.*?\s模式指示)。它还将匹配文本“下午”。或者"pm“也是这样。与"am“或"pm”匹配的字符串部分将在第二个捕获组中捕获(由正则表达式第二部分的括号表示)。

要在替换()方法中使用这个正则表达式,可以使用替换字符串中的$2占位符来引用第二个捕获组。例如:

替换(/^(.?\s)( a. \sm\s*m)/g,“$1$2”;//返回“凌晨2:0”

(/^(.?\s)(a.\sm\s*m)/g,“$1$2”;//返回"2:0 pm“

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74678747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档