strings - Scanner Delimiters

博客介绍了Java中Scanner默认按空白分割输入标记,也可通过正则表达式指定分隔符。给出多个示例展示如何从字符串读取内容,还提到默认空白分隔符及重置方法,最后列出相关参考资料。

By default, a Scanner splits input tokens along whitespace, but we can also specify our own delimiter pattern in the form of a regular expression.

example 1:

// strings/ScannerDelimiter.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.

import java.util.*;

public class ScannerDelimiter {
  public static void main(String[] args) {
    Scanner scanner = new Scanner("12, 42, 78, 99, 42");
    scanner.useDelimiter("\\s*,\\s*");
    while (scanner.hasNextInt()) {
      System.out.println(scanner.nextInt());
    }
  }
}
/* Output:
12
42
78
99
42
*/

example 2:

This example reads several items in from a string:


     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close();
 

prints the following output:


     1
     2
     red
     blue
 

The same output can be generated with this code, which uses a regular expression to parse all four tokens at once:


     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input);
     s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
     MatchResult result = s.match();
     for (int i=1; i<=result.groupCount(); i++) {
         System.out.println(result.group(i)); 
     }
     s.close();
 

The default whitespace delimiter used by a scanner is as recognized by Character.isWhitespace. The reset() method will reset the value of the scanner's delimiter to the default whitespace delimiter regardless of whether it was previously changed.

example 3:

// strings/ThreatAnalyzer.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.

import java.util.*;
import java.util.regex.*;

public class ThreatAnalyzer {
  static String threatData =
      "58.27.82.161@08/10/2015\n"
          + "204.45.234.40@08/11/2015\n"
          + "58.27.82.161@08/11/2015\n"
          + "58.27.82.161@08/12/2015\n"
          + "58.27.82.161@08/12/2015\n"
          + "[Next log section with different data format]";

  public static void main(String[] args) {
    Scanner scanner = new Scanner(threatData);
    String pattern = "(\\d+[.]\\d+[.]\\d+[.]\\d+)@" + "(\\d{2}/\\d{2}/\\d{4})";
    while (scanner.hasNext(pattern)) {
      scanner.next(pattern);
      MatchResult match = scanner.match();
      String ip = match.group(1);
      String date = match.group(2);
      System.out.format("Threat on %s from %s%n", date, ip);
    }
  }
}
/* Output:
Threat on 08/10/2015 from 58.27.82.161
Threat on 08/11/2015 from 204.45.234.40
Threat on 08/11/2015 from 58.27.82.161
Threat on 08/12/2015 from 58.27.82.161
Threat on 08/12/2015 from 58.27.82.161
*/

Regular expression

POSIXNon-standardPerl/TclVimJavaASCIIDescription
 [:ascii:][29]  \p{ASCII}[\x00-\x7F]ASCII characters
[:alnum:]   \p{Alnum}[A-Za-z0-9]Alphanumeric characters
 [:word:][29]\w\w\w[A-Za-z0-9_]Alphanumeric characters plus "_"
  \W\W\W[^A-Za-z0-9_]Non-word characters
[:alpha:]  \a\p{Alpha}[A-Za-z]Alphabetic characters
[:blank:]  \s\p{Blank}[ \t]Space and tab

references:

1. On Java 8 - Bruce Eckel

2. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/strings/ScannerDelimiter.java

3. https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

4. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/strings/ThreatAnalyzer.java

5. https://en.wikipedia.org/wiki/Regular_expression

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
### 使用 `strings` 命令的 `-f` 选项 在 Linux 系统中,`strings` 命令用于从二进制文件或其他非文本文件中提取可打印的字符串。`-f` 选项会为每个输出的字符串附加文件名[^3]。这在处理多个文件时非常有用,可以清楚地知道每个字符串来自哪个文件。 以下是使用 `strings` 命令及其 `-f` 选项的详细说明和示例: #### 基本语法 ```bash strings [选项] 文件名 ``` #### `-f` 选项的用法 当指定 `-f` 选项时,`strings` 会在每个字符串前打印文件名。如果需要更紧凑的输出,可以结合 `-n` 选项来设置最小字符串长度。 #### 示例代码 以下是一个简单的示例,展示如何使用 `-f` 选项: ```bash # 创建一个包含可打印字符串的二进制文件 echo "Hello, World!" > example.bin # 使用 strings 命令并启用 -f 选项 strings -f example.bin ``` 运行上述命令后,输出将类似于以下内容: ``` example.bin: Hello, World! ``` #### 结合其他选项 可以与其他选项一起使用以增强功能。例如,使用 `-n` 指定最小字符串长度: ```bash strings -f -n 5 example.bin ``` 此命令只会输出长度至少为 5 的字符串,并附带文件名。 #### 注意事项 1. 如果没有指定文件名,`strings` 默认从标准输入读取数据。 2. 对于大型文件或目录中的多个文件,建议结合 `find` 或 `xargs` 命令使用。 ```bash find /path/to/files -type f -exec strings -f {} \; ``` 此命令会递归查找指定路径下的所有文件,并对每个文件运行 `strings -f`。 ### 相关工具 `strings` 命令通常与 `grep` 配合使用,以便过滤出特定的字符串[^3]。例如: ```bash strings -f /path/to/binary | grep "specific-pattern" ``` 此命令会从二进制文件中提取所有字符串,并仅显示包含 `"specific-pattern"` 的行。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值