Java常用的API_02(正则表达式、爬虫)

news/2024/9/13 20:50:40/ 标签: java, 正则表达式, 爬虫

Java正则表达式

  • 七、正则表达式
    • 7.1 格式
      • 7.1.1 字符类
        • 注意
        • 字符类示例代码1
        • 例2
      • 7.1.2 预定义字符
        • 预定义字符示例代码
        • 例2
      • 7.1.3 区别总结
    • 7.2 使用`Pattern`和`Matcher`类与直接使用`String`类的`matches`方法的区别。
      • (1) 使用`Pattern`和`Matcher`类
        • 示例代码
      • (2)直接使用`String`类的`matches`方法
        • 示例代码
      • (3)区别总结
      • (4)示例对比
          • 使用`Pattern`和`Matcher`类
        • 直接使用`String`类的`matches`方法
    • 7.3 数量词
    • 7.4这是一个正则表达式符号的总结表。
      • 7.4.1 各个符号
        • 解释
      • 7.4.2 量词总结表。
        • 解释
  • 八、爬虫
    • 8.1 条件爬取
      • 8.1.1 正向预查
      • 8.1.2 其他的
    • 8.2贪婪爬取
    • 8.3 正则表达式中的方法
    • 8.4 分组
      • 8.4.1 首尾相同单字符 abc123cba
      • 8.4.2 首尾相同多字符abc123abc
      • 8.4.3 开始的样式和结束的样式一样aaa12aaa

七、正则表达式

正则表达式是一种强大的文本匹配工具,用于在字符串中搜索和匹配特定模式的文本。
在Java中,正则表达式java.util.regex包提供支持。它可以用于验证输入的格式、提取文本中的特定部分、替换文本等操作。

7.1 格式

7.1.1 字符类

字符类用于匹配一组字符中的任意一个字符。字符类用方括号[]括起来,表示在这些字符中匹配一个字符。

  • [abc]:匹配字符a、b或c。
  • [^abc]:匹配除a、b、c之外的任何字符。
  • [a-zA-Z]:匹配从a到z或从A到Z的任意一个字符。
  • [a-d[m-p]]:匹配a到d或m到p的任意一个字符。
  • [a-z&&[def]]:匹配a到z和def的交集,即d、e、f。
  • [a-z&&[^bc]]:匹配a到z并且不包括b和c的字符(即[ad-z])。
  • [a-z&&[^m-p]]:匹配a到z并且不包括m到p的字符(即[a-lq-z])。
注意
  • [a-z&&[def]]:匹配a到z和def的交集,即d、e、f。
  • 像这样的&&,必须是两个,如果是一个&,就只是说明其是一个‘&’字符符号
字符类示例代码1
java">import java.util.regex.Matcher;
import java.util.regex.Pattern;public class CharClassExample {public static void main(String[] args) {// 匹配a、b或c中的任意一个字符String regex1 = "[abc]";String input1 = "apple";System.out.println(matchesPattern(regex1, input1)); // true// 匹配除a、b、c之外的任何字符String regex2 = "[^abc]";String input2 = "def";System.out.println(matchesPattern(regex2, input2)); // true// 匹配从a到z或从A到Z的任意一个字符String regex3 = "[a-zA-Z]";String input3 = "Hello";System.out.println(matchesPattern(regex3, input3)); // true// 匹配a到d或m到p的任意一个字符String regex4 = "[a-d[m-p]]";String input4 = "cat";System.out.println(matchesPattern(regex4, input4)); // true// 匹配a到z和def的交集,即d、e、fString regex5 = "[a-z&&[def]]";String input5 = "dog";System.out.println(matchesPattern(regex5, input5)); // true// 匹配a到z并且不包括b和c的字符String regex6 = "[a-z&&[^bc]]";String input6 = "apple";System.out.println(matchesPattern(regex6, input6)); // true// 匹配a到z并且不包括m到p的字符String regex7 = "[a-z&&[^m-p]]";String input7 = "hello";System.out.println(matchesPattern(regex7, input7)); // true}private static boolean matchesPattern(String regex, String input) {Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(input);return matcher.find();}
}
例2
java">public class CharClassExample {public static void main(String[] args) {// 只能是 a b cSystem.out.println("----------1----------");System.out.println("a".matches("[abc]")); // trueSystem.out.println("k".matches("[abc]")); // false// 不能出现 a b cSystem.out.println("----------2----------");System.out.println("a".matches("[^abc]")); // falseSystem.out.println("z".matches("[^abc]")); // trueSystem.out.println("zz".matches("[^abc]")); // falseSystem.out.println("zz".matches("[^abc][^abc]")); // true// a到z A到Z (包括头尾的范围)System.out.println("----------3----------");System.out.println("a".matches("[a-zA-Z]")); // trueSystem.out.println("Z".matches("[a-zA-Z]")); // trueSystem.out.println("aa".matches("[a-zA-Z]")); // falseSystem.out.println("zz".matches("[a-zA-Z]")); // falseSystem.out.println("0".matches("[a-zA-Z]")); // false}
}

7.1.2 预定义字符

匹配一组字符中的任意一个字符,其用于简化正则表达式的书写。

  • .:匹配任意字符。
  • \d:匹配一个数字字符,相当于[0-9]
  • \D:匹配一个非数字字符,相当于[^0-9]
  • \s:匹配一个空白字符,包括空格、制表符、换行符等,相当于[\t\n\x0B\f\r]
  • \S:匹配一个非空白字符,相当于[^\s]
  • \w:匹配一个单词字符,包括字母、数字和下划线,相当于[a-zA-Z_0-9]
  • \W:匹配一个非单词字符,相当于[^\w]

通过使用这些字符类和预定义字符,可以构建出复杂的正则表达式来匹配特定的文本模式。

预定义字符示例代码
java">import java.util.regex.Matcher;
import java.util.regex.Pattern;public class PredefinedCharExample {public static void main(String[] args) {// 匹配任意字符String regex1 = ".";String input1 = "a";System.out.println(matchesPattern(regex1, input1)); // true// 匹配一个数字字符String regex2 = "\\d";String input2 = "5";System.out.println(matchesPattern(regex2, input2)); // true// 匹配一个非数字字符String regex3 = "\\D";String input3 = "a";System.out.println(matchesPattern(regex3, input3)); // true// 匹配一个空白字符String regex4 = "\\s";String input4 = " ";System.out.println(matchesPattern(regex4, input4)); // true// 匹配一个非空白字符String regex5 = "\\S";String input5 = "a";System.out.println(matchesPattern(regex5, input5)); // true// 匹配一个单词字符String regex6 = "\\w";String input6 = "a";System.out.println(matchesPattern(regex6, input6)); // true// 匹配一个非单词字符String regex7 = "\\W";String input7 = "!";System.out.println(matchesPattern(regex7, input7)); // true}private static boolean matchesPattern(String regex, String input) {Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(input);return matcher.find();}
}
例2
java">public class PredefinedCharExample {public static void main(String[] args) {// 匹配任意字符System.out.println("----------1----------");System.out.println("a".matches(".")); // trueSystem.out.println("1".matches(".")); // trueSystem.out.println(" ".matches(".")); // trueSystem.out.println("\n".matches(".")); // false// 匹配一个数字字符System.out.println("----------2----------");System.out.println("5".matches("\\d")); // trueSystem.out.println("a".matches("\\d")); // false// 匹配一个非数字字符System.out.println("----------3----------");System.out.println("a".matches("\\D")); // trueSystem.out.println("5".matches("\\D")); // false// 匹配一个空白字符System.out.println("----------4----------");System.out.println(" ".matches("\\s")); // trueSystem.out.println("\t".matches("\\s")); // trueSystem.out.println("a".matches("\\s")); // false// 匹配一个非空白字符System.out.println("----------5----------");System.out.println("a".matches("\\S")); // trueSystem.out.println(" ".matches("\\S")); // false// 匹配一个单词字符System.out.println("----------6----------");System.out.println("a".matches("\\w")); // trueSystem.out.println("1".matches("\\w")); // trueSystem.out.println("_".matches("\\w")); // trueSystem.out.println("!".matches("\\w")); // false// 匹配一个非单词字符System.out.println("----------7----------");System.out.println("!".matches("\\W")); // trueSystem.out.println("a".matches("\\W")); // false}
}

在Java中,使用正则表达式进行字符串匹配时,字符类和预定义字符的写法有一些区别。以下是两种写法的主要区别:

7.1.3 区别总结

  1. 字符类

    • 使用方括号[]定义。
    • 可以包含单个字符、字符范围或字符集的交集和补集。
    • 适用于需要匹配特定字符集合的情况。
  2. 预定义字符

    • 使用反斜杠\加特定字符定义。
    • 是常用字符类的简写形式。
    • 适用于匹配常见字符类型(如数字、字母、空白字符等)的情况。

7.2 使用PatternMatcher类与直接使用String类的matches方法的区别。

(1) 使用PatternMatcher

这种方法适用于需要多次复用同一个正则表达式的情况。通过编译正则表达式Pattern对象,然后使用Matcher对象进行匹配,可以提高效率。

示例代码
java">import java.util.regex.Matcher;
import java.util.regex.Pattern;public class PatternMatcherExample {public static void main(String[] args) {String regex1 = "[abc]";String input1 = "apple";System.out.println(matchesPattern(regex1, input1)); // true}private static boolean matchesPattern(String regex, String input) {Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(input);return matcher.find();}
}

(2)直接使用String类的matches方法

这种方法适用于简单的、一次性的正则表达式匹配。String类的matches方法会在内部编译正则表达式并进行匹配,适合于不需要复用正则表达式的情况。

示例代码
java">public class StringMatchesExample {public static void main(String[] args) {// 只能是 a b cSystem.out.println("----------1----------");System.out.println("a".matches("[abc]")); // trueSystem.out.println("k".matches("[abc]")); // false}
}

(3)区别总结

  1. 使用PatternMatcher

    • 适用于需要多次复用同一个正则表达式的情况。
    • 通过编译正则表达式Pattern对象,然后使用Matcher对象进行匹配。
    • 提高了效率,特别是在需要多次匹配的情况下。
  2. 直接使用String类的matches方法

(4)示例对比

使用PatternMatcher
java">import java.util.regex.Matcher;
import java.util.regex.Pattern;public class PatternMatcherExample {public static void main(String[] args) {String regex1 = "[abc]";String input1 = "apple";System.out.println(matchesPattern(regex1, input1)); // true}private static boolean matchesPattern(String regex, String input) {Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(input);return matcher.find();}
}
直接使用String类的matches方法
java">public class StringMatchesExample {public static void main(String[] args) {// 只能是 a b cSystem.out.println("----------1----------");System.out.println("a".matches("[abc]")); // trueSystem.out.println("k".matches("[abc]")); // false}
}

7.3 数量词

  • X?:X,一次或0次
  • X*:X,零次或多次
  • X+:X,一次或多次
  • X{n}:X,正好n次
  • X{n,}:X,至少n次
  • X{n,m}:X,至少n但不超过m次

这些量词用于正则表达式中来指定字符或子模式的重复次数。

java">public class RegexExample {public static void main(String[] args) {// 示例1: X?System.out.println("aaab".matches("a?")); // falseSystem.out.println("a".matches("a?"));    // trueSystem.out.println("".matches("a?"));     // true// 示例2: X*System.out.println("aaab".matches("a*")); // falseSystem.out.println("aaa".matches("a*"));  // trueSystem.out.println("".matches("a*"));     // true// 示例3: X+System.out.println("aaab".matches("a+")); // falseSystem.out.println("aaa".matches("a+"));  // trueSystem.out.println("a".matches("a+"));    // true// 示例4: X{n}System.out.println("aaab".matches("a{2}")); // falseSystem.out.println("aa".matches("a{2}"));   // true// 示例5: X{n,}System.out.println("aaab".matches("a{2,}")); // falseSystem.out.println("aaa".matches("a{2,}"));  // true// 示例6: X{n,m}System.out.println("aaab".matches("a{1,2}")); // falseSystem.out.println("aa".matches("a{1,2}"));   // trueSystem.out.println("a".matches("a{1,2}"));    // true}
}

在这里插入图片描述

  • (?i):这是一个正则表达式的模式修饰符,用于忽略大小写。
java">public class RegexExample {public static void main(String[] args) {// 忽略大小写的书写方式// 在匹配的时候忽略abc的大小写String regex = "a(?i)bc";System.out.println("----------------------------");System.out.println("abc".matches(regex)); // trueSystem.out.println("ABC".matches(regex)); // trueSystem.out.println("aBC".matches(regex)); // true}
}

同样的忽略
(X|x)与 [Xx]

注意()的使用
()立大功

java">public class RegexExample {public static void main(String[] args) {// 忽略大小写的书写方式// 在匹配的时候忽略b的大小写String regex = "a((?i)b)c";System.out.println("----------------------------");System.out.println("abc".matches(regex)); // trueSystem.out.println("ABC".matches(regex)); // falseSystem.out.println("aBc".matches(regex)); // true}
}

7.4这是一个正则表达式符号的总结表。

7.4.1 各个符号

符号含义示例
[]里面的内容出现一次[0-9] [a-zA-Z0-9]
()分组a(bc)+
^取反[^abc]
&&交集,不能写单个的&[a-z&&m-p]
``写在方括号外面表示并集
.任意字符\n 回车符号不匹配
\转义字符\\d
\d0-9\\d+
\D非0-9\\D+
\s空白字符[ \t\n\x0B\f\r]
\S非空白字符[^\\s]
\w单词字符[a-zA-Z_0-9]
\W非单词字符[^\\w]
解释
  • []:匹配方括号内的任意一个字符。例如,[0-9]匹配任何一个数字。
  • ():用于分组。例如,a(bc)+匹配a后面跟一个或多个bc
  • ^:在方括号内表示取反。例如,[^abc]匹配任何不是abc的字符。
  • &&:表示交集。例如,[a-z&&m-p]匹配mp之间的字符。
  • |:表示并集。例如,x|X匹配xX
  • .:匹配任意字符(除了换行符)。
  • \:转义字符,用于转义特殊字符。
  • \d:匹配任何一个数字(0-9)。
  • \D:匹配任何一个非数字字符。
  • \s:匹配任何一个空白字符(包括空格、制表符、换行符等)。
  • \S:匹配任何一个非空白字符。
  • \w:匹配任何一个单词字符(包括字母、数字和下划线)。
  • \W:匹配任何一个非单词字符。

这些符号和示例可以帮助你更好地理解和使用正则表达式

7.4.2 量词总结表。

符号含义示例
?0次或1次\\d?
*0次或多次\\d* (abc)*
+1次或多次\\d+ (abc)+
{}具体次数a{7} \\d{7,19}
(?i)忽略后面字符的大小写(?i)abc
a((?i)b)c只忽略b的大小写a((?i)b)c
解释
  • ?:匹配前面的字符0次或1次。例如,\\d?匹配0个或1个数字。
  • *:匹配前面的字符0次或多次。例如,\\d*匹配0个或多个数字,(abc)*匹配0个或多个abc
  • +:匹配前面的字符1次或多次。例如,\\d+匹配1个或多个数字,(abc)+匹配1个或多个abc
  • {}:匹配前面的字符具体的次数。例如,a{7}匹配7个a\\d{7,19}匹配7到19个数字。
  • (?i):忽略后面字符的大小写。例如,(?i)abc匹配abcABCaBc等。
  • a((?i)b)c:只忽略b的大小写。例如,a((?i)b)c匹配abcaBc,但不匹配ABC

八、爬虫

8.1 条件爬取

8.1.1 正向预查

要匹配的内容后面加上一个正向预查,指定后面的数据需要存在但不包含在匹配结果中。

java">String text = "前面的数据后面的数据";
String pattern = "前面的数据(?=后面的数据)";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(text);if (m.find()) {System.out.println(m.group());
}

在这里插入图片描述

在这个示例中,正则表达式(?=后面的数据)表示匹配"前面的数据"后面紧跟着"后面的数据",但只返回"前面的数据"部分。

8.1.2 其他的

java">String text = "前面的数据后面的数据";
String pattern = "前面的数据(?:后面的数据)";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(text);if (m.find()) {System.out.println(m.group());
}

在这里插入图片描述
非捕获分组不需要再用本组数据,仅仅把数据括起来,不占组号。
(?:)(?=)(?!)

符号含义
?:正则获取所有
?=正则获取前面
?! 正则 获取不是指定内容的前面的部分

8.2贪婪爬取

只写+或者·*·就是贪婪爬取
+?非贪婪爬取
*?非贪婪爬取
在这里插入图片描述

以下是使用贪婪匹配和非贪婪匹配的正则表达式示例:

  1. 使用贪婪匹配+
java">String text = "aaaaaab";
String pattern = "a+";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(text);while (m.find()) {System.out.println("贪婪匹配结果:" + m.group());
}
  1. 使用非贪婪匹配+?
java">String text = "aaaaaab";
String pattern = "a+?";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(text);while (m.find()) {System.out.println("非贪婪匹配结果:" + m.group());
}
  1. 使用贪婪匹配*
java">String text = "aaaaaab";
String pattern = "a*";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(text);while (m.find()) {System.out.println("贪婪匹配结果:" + m.group());
}
  1. 使用非贪婪匹配*?
java">String text = "aaaaaab";
String pattern = "a*?";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(text);while (m.find()) {System.out.println("非贪婪匹配结果:" + m.group());
}

这些示例演示了贪婪匹配和非贪婪匹配在正则表达式中的应用。

8.3 正则表达式中的方法

在Java中,正则表达式的常用方法包括matchesreplaceAllsplit。下面是它们的简要介绍:

  • matches:用于检查整个字符串是否匹配正则表达式。返回一个布尔值,表示是否完全匹配。
java">String text = "Hello, World!";
boolean isMatch = text.matches("Hello.*");
System.out.println(isMatch); // true
  • replaceAll:用于替换字符串中匹配正则表达式的部分。可以用指定的字符串替换匹配的部分。
java">String text = "apple, orange, banana";
String replacedText = text.replaceAll("\\b\\w+\\b", "fruit");
System.out.println(replacedText); // fruit, fruit, fruit
  • split:根据正则表达式将字符串拆分为子字符串数组。返回一个字符串数组,包含根据正则表达式拆分的子字符串。
java">String text = "apple,orange,banana";
String[] fruits = text.split("a");
for (String fruit : fruits) {System.out.println(fruit);
}
//pple,or
//nge,b
//n
//n

这些方法可以帮助你在Java中使用正则表达式进行匹配、替换和拆分字符串。

8.4 分组

在Java中,可以使用圆括号()来创建一个分组。

正则表达式中,分组可以对匹配的部分进行逻辑分组,以便后续引用或操作。
组号是连续的,从1开始不间断的。以左括号为基准。
非捕获分组不需要再用本组数据,仅仅把数据括起来,不占组号。

(?:)(?=)(?!)
在这里插入图片描述

java">public class SimplifyString {public static void main(String[] args) {// 定义原始字符串String s = "aabbbbbbcccc";// 使用正则表达式替换重复的字符// (.) 捕获组匹配任意字符// \\1+ 量词匹配捕获组1的一次或多次出现// $1 引用捕获组1的内容(即匹配的单个字符)进行替换String simplified = s.replaceAll("(.)\\1+", "$1");// 输出简化后的字符串System.out.println(simplified);  // 输出: abc}
}

8.4.1 首尾相同单字符 abc123cba

\\组号意味着吧X组的东西在拿来用一次

java">String regex1="(.).+\\1";

在这里插入图片描述

8.4.2 首尾相同多字符abc123abc

java">String regex1="(.+).+\\1";

在这里插入图片描述

8.4.3 开始的样式和结束的样式一样aaa12aaa

(.)是把字母看做一组
\\2是把首字母重复
*是把\\2, ——— 0次或者多次

java">String regex1="((.)\\2*).+\\1";

在这里插入图片描述


http://www.ppmy.cn/news/1475244.html

相关文章

使用Spring Boot创建自定义Starter

Spring Boot的起步依赖(Starter)简化了Spring应用的开发,提供了一组默认的库和配置。自定义Starter可以帮助你封装通用功能,便于在多个项目中重用。本文将详细介绍如何创建和使用自定义Spring Boot Starter。 一、什么是Spring B…

springboot增加过滤器后中文乱码

记录一下小问题 public class RepeatableHttpServletWrapper extends HttpServletRequestWrapper {private byte[] body;public RepeatableHttpServletWrapper(HttpServletRequest request) throws IOException {super(request);request.setCharacterEncoding("UTF-8&q…

物联网可编程中央控制主机

物联网可编程中央控制主机(Programmable Central Control Host for IoT,如GF-MAXCC)在多个领域都有广泛的应用。这些应用领域包括但不限于: 1. 智能家居 GEFFEN在智能家居系统中,物联网可编程中央控制主机充当着家庭…

批量制作word表格

问题背景 将excel表中的成绩内容制作为成绩单,每页对应一个学员的成绩,方便打印 代码实现 ## 导入包 import pandas as pd from docx import Document from docx.enum.text import WD_ALIGN_PARAGRAPH,WD_LINE_SPACING# 读取 Excel 内容 df pd.read_e…

巴基斯坦火爆的slots游戏借力Facebook广告获客优势分析

巴基斯坦火爆的slots游戏借力Facebook广告获客优势分析 在巴基斯坦,Slots游戏凭借其独特的魅力和玩法,深受玩家的喜爱。而在众多的推广渠道中,Facebook广告代投凭借其显著的优势,成为了Slots游戏在巴基斯坦市场推广的重要选择。以…

文心一言使用指南

文心一言使用指南 文心一言是百度推出的一款大语言模型,具备跨模态、跨语言的深度语义理解与生成能力。以下是文心一言的详细使用指南,帮助用户快速上手并充分利用其功能。 一、注册与登录 注册账号: 访问文心一言的官方网站或应用商店&am…

稀疏建模介绍,详解机器学习知识

目录 一、什么是机器学习?二、稀疏建模介绍三、Lasso回归简介四、Lasso超参数调整与模型选择 一、什么是机器学习? 机器学习是一种人工智能技术,它使计算机系统能够从数据中学习并做出预测或决策,而无需明确编程。它涉及到使用算…

力扣第226题“翻转二叉树”

在本篇文章中,我们将详细解读力扣第226题“翻转二叉树”。通过学习本篇文章,读者将掌握如何使用递归和迭代的方法来翻转二叉树,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述 力扣第…

Eureka 介绍与使用

Eureka 是一个开源的服务发现框架,它主要用于在分布式系统中管理和发现服务实例。它由 Netflix 开发并开源,是 Netflix OSS 中的一部分。 使用 Eureka 可以方便地将新的服务实例注册到 Eureka 服务器,并且让其他服务通过 Eureka 服务器来发现…

智能家居开发新进展:乐鑫 ESP-ZeroCode 与亚马逊 ACK for Matter 实现集成

日前,乐鑫 ESP-ZeroCode 与亚马逊 Alexa Connect Kit (ACK) for Matter 实现了集成。这对智能家居设备制造商来说是一项重大进展。开发人员无需编写固件或开发移动应用程序,即可轻松设计符合 Matter 标准的产品。不仅如此,开发者还可以在短短…

grafana数据展示

目录 一、安装步骤 二、如何添加喜欢的界面 三、自动添加注册客户端主机 一、安装步骤 启动成功后 可以查看端口3000是否启动 如果启动了就在浏览器输入IP地址:3000 账号密码默认是admin 然后点击 log in 第一次会让你修改密码 根据自定义密码然后就能登录到界面…

pdf工具

iLovePDF | 为PDF爱好者提供的PDF文件在线处理工具 https://www.ilovepdf.com/zh-cn 图片 pdf 合并成一个pdf也可以拆分

使用引用 XML 文件来优化 EtherCAT ESI 文件的描述

使用引用 XML 文件来优化 EtherCAT ESI 文件的描述 在 EtherCAT 系统中,ESI (EtherCAT Slave Information) 文件是描述 EtherCAT 从设备属性和行为的重要文件。随着系统复杂度的增加,ESI 文件的内容可能会变得非常庞大和冗余。为了优化这些文件&#xf…

美团收银Android一面凉经(2024)

美团收银Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《美团收银Android一面凉经(2024)》。 应聘岗位: 美团餐饮PaaS平台Android开发工程师…

泛微E-Cology WorkflowServiceXml SQL注入漏洞复现

0x01 产品简介 泛微e-cology是一款由泛微网络科技开发的协同管理平台,支持人力资源、财务、行政等多功能管理和移动办公。 0x02 漏洞概述 2024年7月,泛微官方发布了新补丁,修复了一处SQL注入漏洞。经分析,攻击者无需认证即可利用该漏洞,建议受影响的客户尽快修复漏洞。…

26.7 Django单表操作

1. 模型管理器 1.1 Manager管理器 Django ORM中, 每个Django模型(Model)至少有一个管理器, 默认的管理器名称为objects. objects是一个非常重要的管理器(Manager)实例, 它提供了与数据库进行交互的接口.通过管理器, 可以执行数据库查询, 保存对象到数据库等操作.objects管理器…

CentOS搭建邮件服务器:DNS配置方法技巧?

CentOS搭建邮件服务器的流程?如何高效使用CentOS? 在当今数字化时代,邮件服务器的需求日益增加。为了确保邮件能够顺利送达,正确的DNS配置是必不可少的一环。AokSend将详细介绍在CentOS搭建邮件服务器过程中,如何进行…

【Stable Diffusion】(基础篇三)—— 关键词和参数设置

提示词和文生图参数设置 本系列笔记主要参考B站nenly同学的视频教程,传送门:B站第一套系统的AI绘画课!零基础学会Stable Diffusion,这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 本文主要讲…

html高级篇

1.2D转换 转换(transform)你可以简单理解为变形 移动:translate 旋转:rotate 缩放:sCale 移动:translate 1.移动具体值 /* 移动盒子的位置: 定位 盒子的外边距 2d转换移动 */div {width…

go 密码hash加密包 bcrypt

1.明文密码一般都会通过一套算法转成一条长长的字符串,密码验证这需要通过验证明文和加密字符串是否对应 2.go 有现成的hash算法包 "golang.org/x/crypto/bcrypt" 一般我们有一个工具包utils ,在工具里封装两个方法即可, 即 明文…