【问题标题】:Match a not 8 character (digit/a-z/A-Z) long word through regex通过正则表达式匹配一个非 8 字符(数字/a-z/A-Z)长字
【发布时间】:2016-06-20 22:15:53
【问题描述】:

这是我发布的第一个问题,很抱歉我可能搞砸了。

在过去的一个小时里,我一直在试验和寻找一种方法,通过常规方法在 Notepad++ 中用空格替换“非 8 个字符(数字/a-z/A-Z)长单词”(或者换句话说,删除除这些单词之外的任何内容)表达式。

我设法为包含它们的行添加了书签,但我被包含该单词的整行所困扰,我只想要那些特定的单词。我会很感激任何帮助,非常感谢!

Edit2:更好的表达方式是:
要删除任何不是:8 个字符长,以 S 开头,仅包含数字和字母。换句话说,删除任何不是 S******* where *=digit,letter

编辑:我意识到这不足以理解这种情况,所以这里有一个例子。我想处理这个:

Here's your first code: S284JF2B
Here's your second code: SKE093JF
Here's your third code: S28fka30

得到这个输出:

S284JF2B
SD34EQ5M 
SASFKA30

实际文件有很多其他字符,而不仅仅是数字/字母,而且我想要输出的代码总是 8 个字符长(数字/大写字母),总是以 S 开头。

【问题讨论】:

  • 您能说得更具体些吗?示例行是什么?你需要什么输出?你试过什么?
  • 感谢您的快速回复。它是短信(xml)的备份文件,这是一个典型的行:
  • 尝试将.*?\bbody="([^"]*)".*|.*替换为$1,然后删除空行。
  • 您的第三个代码 S28fvka30 有 9 个字符长,与输出完全不匹配
  • 这让它变得更好了!不过,我仍然在与 8 个字符代码相同的行中有其他单词。我在问题中添加了更多信息,这可能对我有帮助:)

标签: regex notepad++


【解决方案1】:

我有两种可能的解决方案。两种解决方案都要求字符串长度为 8 个字符并以 S 开头。

鉴于此示例文本:

the problem is it's not the words that do not contain any words that I don't want 
but actually any string that isn't a string that starts with an S and is 8 character long. 
Example: S294KS12 this is the type of string I want on the document. Contains 8 characters 
that are either digits or letters and starts with an S

SOMETIME
S294KS12
S1234567
S123456A

选项 1

此解决方案仅查找长度为 8 个字符且以 S 开头的字符串。

\bS[A-Z0-9]{7}\b

现场演示

https://regex101.com/r/lK0aO9/1

样本匹配

S294KS12
SOMETIME
S294KS12
S1234567
S123456A

说明

NODE                     EXPLANATION
----------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char
----------------------------------------------------------------------
  S                        'S'
----------------------------------------------------------------------
  [A-Z0-9]{7}              any character of: 'A' to 'Z', '0' to '9'
                           (7 times)
----------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char
----------------------------------------------------------------------

选项 2

此解决方案会进行额外检查以确保至少有一个额外的字母和一个数字。

\bS(?=[A-Z]*[0-9])(?=[0-9]*[A-Z])[A-Z0-9]{7}\b

现场演示

https://regex101.com/r/vH4lX2/3

样本匹配

S294KS12
S294KS12
S123456A

说明

NODE                     EXPLANATION
----------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char
----------------------------------------------------------------------
  S                        'S'
----------------------------------------------------------------------
  (?=                      look ahead to see if there is:
----------------------------------------------------------------------
    [A-Z]*                   any character of: 'A' to 'Z' (0 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
    [0-9]                    any character of: '0' to '9'
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------
  (?=                      look ahead to see if there is:
----------------------------------------------------------------------
    [0-9]*                   any character of: '0' to '9' (0 or more
                             times (matching the most amount
                             possible))
----------------------------------------------------------------------
    [A-Z]                    any character of: 'A' to 'Z'
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------
  [A-Z0-9]{7}              any character of: 'A' to 'Z', '0' to '9'
                           (7 times)
----------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char
----------------------------------------------------------------------

把所有的放在一起

要替换其他所有内容,我会将正则表达式合并到 ( ... )\s?|. 中,这将匹配所有内容,包括所需的字符串。

如果您随后在 Notepad++ 的替换为选项中使用 $1,那么您将只剩下所需的字符串。

我建议使用上面的选项 2,并将其插入到表达式中,使其看起来像这样:

(\bS(?=[A-Z]*[0-9])(?=[0-9]*[A-Z])[A-Z0-9]{7}\b)\s?|.

替换为: $1

现场演示

https://regex101.com/r/gO7zV7/1

【讨论】:

  • 你是真正的交易。非常感谢您坚持到最后。这正是我想要的,对于因缺乏信息而给您带来的所有麻烦,我们深表歉意。再次感谢:)
  • @ro yo mi:你用什么工具来做这些很酷的正则表达式表示?
【解决方案2】:

说明

缺少任何适当的示例,这将找到长度为 8 个字符且不包含任何字母的子字符串。子字符串必须用空格或字符串的开头或结尾括起来

(?<=\s|^)[^a-zA-Z0-9\s]{8}(?=\s|$)

示例

现场演示

https://regex101.com/r/gS9uN7/1

示例文本

过去一个小时我一直在试验和寻找一种方法来用空白替换“not 8 character (digit/a-z/A-Z) $#@!#$> fd long word”通过正则表达式在 Notepad++ 中使用空格(或者换句话说,删除除这些单词之外的任何内容)。

示例匹配

$#@!#$><

更换后

在过去的一个小时里,我一直在试验和寻找一种方法,在 Notepad++ 中通过正则表达式。

说明

NODE                     EXPLANATION
----------------------------------------------------------------------
  (?<=                     look behind to see if there is:
----------------------------------------------------------------------
    \s                       whitespace (\n, \r, \t, \f, and " ")
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    ^                        after an optional start of the string
----------------------------------------------------------------------
  )                        end of look-behind
----------------------------------------------------------------------
  [^a-zA-Z0-9\s]{8}           any character except: 'a' to 'z', 'A' to
                           'Z', '0' to '9', whitespace (\n, \r, \t, \f, and " ")
                           (8 times)
----------------------------------------------------------------------
  (?=                      look ahead to see if there is:
----------------------------------------------------------------------
    \s                       whitespace (\n, \r, \t, \f, and " ")
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    $                        before an optional \n, and the end of a
                             "line"
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------

【讨论】:

  • 显然是更详细的答案。
  • 这确实是一个很好的答案。即使它与我想要的不符,我也喜欢学习解释!问题不是不包含任何我不想要的单词的单词,而是实际上任何不是以 S 开头且长度为 8 个字符的字符串的字符串。示例:S294KS12 这是我想要在文档中使用的字符串类型。包含 8 个数字或字母字符,以 S 开头。
【解决方案3】:

要匹配除示例中的标记之外的所有内容:

(^|\s)(?!S\w{7}\b)\S*

如需现场演示,请参阅https://regex101.com/r/rW8mF0/4

要匹配任何非 8 个字符的单词:

\b\w{1,7}\b|\b\w{9,}\b

它匹配长度为 1 - 7 的单词 OR 长度为 9 或更多的单词。

如需现场演示,请参阅https://regex101.com/r/fX2sE5/1

【讨论】:

  • 哈,在阅读了您的解决方案后,我敢打赌这正是他们想要的。
  • 这实际上检测到我想要的字符串,一旦我将它编辑为 \b\w{8}\b 但它也检测到许多其他 8 个字符的单词,我实际上希望正则表达式匹配所有内容,但8 个字符的单词因此不是 8 个字符的长单词。这是我的错,没有提供足够的信息。我将示例添加到问题中。非常感谢你的帮助! :)
  • @le_m 几乎成功了!它实际上完成了这项工作,但在代码之前留下了这个: 有没有可能的方法来处理任何类型的字符串而不是只是文字?我认为这就是问题所在?
  • @AmineErramy 如果您发布代码,请在其前后添加一个`
【解决方案4】:

我已尝试使用以下文本将您的问题与其他非字母数字字符相匹配。

<protocol="toto" john="doe" Here's your first code: S284JF2B sign="+" />
<protocol="toto" john="doe" Here's your second code: SKE093JF sign="+" />
<protocol="toto" john="doe" 8char="s2345678" Here's your third code: S28fka30 sign="+" />

我使用了下面的正则表达式

\b(\w{1,7}|(?=[^S])\w{8}|S(?![A-Za-z0-9]{8})\w{8}|\w{9,})\b|[^\w\r\n]

我在替换时只获得了代码,并在替换窗口中选择了“匹配大小写”选项。

这里有现场演示:https://regex101.com/r/wW3eB1

解释

  • \b(...)\b: 边界之间的单词
  • \w{1,7}:1到7个字母的单词
  • (?=[^S])\w{8}: 不以'S'开头的8个字母的单词
  • S(?![A-Za-z0-9]{8})\w{8}:以“S”开头的单词,包含 8 个字符,但包含字母数字以外的内容(即下划线)
  • |\w{9,}: 9 个字母以上的单词
  • [^\w\r\n]: 既不是单词也不是 EOL 字符的字符

【讨论】:

  • 你试了一次,太棒了!非常感谢他们也完成了这项工作。你和 Ro Yo Mi 采取不同的方法很有趣(我猜?)而且他们都奏效了。我觉得我应该把答案接受给 Ro Yo Mi,他经历了很多,终于明白了我想要什么,他的回答更详尽。不过,我真的很感谢你的帮助。我的选票还不算数,但我也提高了你的回答。再次感谢,我很感激。
  • 很高兴它可以提供帮助。顺便说一句,在您最初的问题中,您忘记提及您有特殊字符,例如双引号、等号等:)
  • 是的,我意识到后来我认为它们也被视为文字或其他东西,老实说,我有点粗心。 x)
【解决方案5】:

我会使用以下正则表达式^.*(S[A-Z0-9]{7})(?!=[A-Z0-9]).*$

  • Ctrl+H
  • 查找内容:^.*(S[A-Z0-9]{7})(?!=[A-Z0-9]).*$
  • 替换为:$1
  • 不要检查. matches newline
  • 全部替换

说明:

^               : begining of line
  .*            : any character 0 or more times
  (             : start group 1
    S[A-Z0-9]{7}: S followed by 7 alphanumeric characters
  )             : end group
  (?!=[A-Z0-9]) : negative lookahead to make sure there are no alphanum after
  .*            : any character 0 or more times
$               : end of line

【讨论】:

  • 太棒了,它实际上将代码放在单独的行中,这比我猜想丢失它们要好,但它并没有删除文档上的所有其他内容。非常感谢,我很感激!
猜你喜欢
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
相关资源
最近更新 更多