【问题标题】:Regex alphanumeric, punctuation as 1 word正则表达式字母数字,标点符号为 1 个单词
【发布时间】:2017-11-10 01:41:47
【问题描述】:

我将每个单词与相同的段落单词进行匹配。

更新 1:我意识到仅仅接受你需要的标点并不能解决这个问题。

示例 'hello-' 和 'hello' 被视为单独的单词。

有没有办法去除单词前后的标点符号和单独的标点符号?只允许在单词中使用标点符号。

$string="_ - – hello’ hello' hello, hello- world. he,llo hello-world hello_world hel-lo-world hello9world"; 

输出应该是

hello hello hello hello world he,llo hello-world hello_world hel-lo-world hello9world

只有单词或单词中的标点符号

更新 2:如果只有单词或单词中的标点符号,十进制数会有问题。

1.0 还是可以的,.1 作为前后标点去掉,会变成 1 而不是 0.1

更新 3:接受 word 中的标点符号, 以字母或数字开头或结尾的子字符串会有问题。 20岁会变成'20-''岁'。

谢谢米克马克萨。

【问题讨论】:

  • 你为什么不匹配[^\s]+而不是空格,以及任何你不想要的东西
  • 那我不明白你在做什么。
  • know this word occur how many times substr_count 如果你知道字符串呢? php.net/manual/en/function.substr-count.php

标签: php regex


【解决方案1】:

模式:/[a-z\d]+(?:[-_’',.][a-z\d]+)*/iu (Pattern Demo)

此模式要求所有匹配的子字符串都以字母或数字开头。子字符串可以包含一个标点字符(字符类[-_’',.] 中的任何一个),但必须紧跟一个或多个字母或数字。 * 表示前面的括号表达式的零个或多个,因此子字符串无论是否包含非字母数字字符都是有效的。

此模式不会将具有两个连续非字母数字字符的子字符串匹配为一个匹配项。例如:20--what 不会返回20--what,而是20what

*如果你想在字符串中间允许任何非空白字符,你可以使用这个: /[a-z\d]+(?:\S[a-z\d]+)*/iu

i 标志也允许 [a-z] 匹配出现的大写字母。
u 标志允许使用 Unicode 字符,例如

PHP 代码:(Demo)

$string="_ - – hel’lo’ hel'lo' .1 1.0 1. hello, hello- world. he,llo hello-world hello_world hel-lo-world hello9world -20 20- 20-year -20year- -20-year- 20-year-old 20-yearold 20year-old 20-year-old-old 20-20-year-20-old-";
echo preg_match_all("/[a-z\d]+(?:[-_’',.][a-z\d]+)*/iu",$string,$out)?implode(' ',$out[0]):'fail';

输出:

hel’lo hel'lo 1 1.0 1 hello hello world he,llo hello-world hello_world hel-lo-world hello9world 20 20 20-year 20year 20-year 20-year-old 20-yearold 20year-old 20-year-old-old 20-20-year-20-old

【讨论】:

  • 这是一个新模式。 regex101.com/r/huvfC1/10我得接送我的孩子,所以我会离开我的电脑一段时间。让我知道这对你有什么作用。
  • 啊,是的。请注意,在我的演示中,我将模式分隔符更改为 ~
  • 我在家呆了几分钟,所以我可以更详细地解释一下...默认/最流行的模式分隔符是/。但是,如果您在模式中使用/,则必须通过编写\/ 对其进行转义。将分隔符更改为 ~ 可避免在模式中转义 /,但随后需要将 ~ 转义为 \~。因此,实际上,更改分隔符没有任何好处。既然我理解了你的模式中的大量标点符号,我必须改变我的建议。将分隔符保留为/,只需转义模式内出现的所有正斜杠,例如:\/
  • sandbox.onlinephpfunctions.com/code/…(演示中的解释)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
相关资源
最近更新 更多